Argumentos de Longitud Variable C++

A la hora de crear una función en C++ por lo general indicamos el numero de argumentos y su correspondiente tipo, por lo que podríamos pensar que siempre que definimos una función esta solo podrá recibir la cantidad de argumentos especificada según el tipo indicado por cada argumento, sin embargo podemos utilizar los () para indicar un numero indefinido de parámetros.

C++ cuenta con varias macros y el encabezado <cstdarg> para el manejo de argumentos de longitud variable, algo que debemos saber es siempre necesitaremos indicar por lo menos un parámetro y que los tres puntos () deben ir al final de la lista de parámetros.
Para demostrar lo que podemos hacer crearemos una función para calcular el promedio de un numero indefinido de valores que pasaremos como parámetros, la función estará definida de este modo:

double promedio(int cantidad, ...)
{

}

El primer parámetro indicara la cantidad de elementos a la cual calcularemos el promedio y seguido enviaremos los valores deseados, para este ejemplo usaremos valores de tipo double.

Uso de las macro (va_list, va_start, va_arg, va_end)


Para poder trabajar con los argumentos variables utilizaremos estas macros, la primera va_list nos sirve para indicar un tipo adecuado para almacenar los valores obtenidos, para inicializar el objeto anterior usamos va_start esta función necesita un objeto del tipo va_list además del parámetro que se encuentra justo antes de los tres puntos (…), va_arg nos devolverá un valor de la lista del tipo que especifiquemos y va_end se encargara de la limpieza.

#include <iostream>
#include <cstdarg>

double promedio(int cantidad, ...)
{
 double total = 0;

 va_list lista_argumentos;
 va_start(lista_argumentos, cantidad);

 for (int i = 1; i <= cantidad; i++)
 {
  total += va_arg(lista_argumentos, double);
 }

 va_end(lista_argumentos);

 return total / cantidad;
}

int main()
{
 double p = promedio(5, 12.5, 5.0, 6.2, 3.0, 5.8);
 std::cout << "Promedio = " << p << std::endl;

 std::cin.ignore();
 return 1;
}

Las listas de argumentos de longitud variable promueven las variables del tipo float al tipo double. Estas listas de argumentos también promueven las variables integrales menores que el tipo int al tipo int (las variables de tipo int, unsigned, long y unsigned long se dejan como están).

Las listas de argumentos de longitud variable se pueden utilizar sólo con argumentos de tipos fundamentales y con argumentos de tipos struct estilo C, que no contienen características específi cas de C++, como las funciones virtual, los constructores, destructores, referencias, miembros de datos const y clases base virtual.

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV

Acceso a la webcam con OpenCV