2010-09-18 18 views
8

Quería escribir una función con una lista de argumentos variables. Quiero explorar mis opciones Estoy bastante seguro de que encontré una clase de plantilla de impulso que fue diseñada para este propósito, pero no puedo pensar en el nombre. ¿Alguien me puede decir? o lo soñé! Gracias ¿Lista de argumentos de variables con impulso?

+0

¿Se refiere a la cantidad de argumentos variables pero un tipo, o también tipos arbitrarios? –

+0

No estoy seguro de qué es exactamente la biblioteca proporcionada, no puedo reubicarla, supongo que fue una especie de mejora sobre va_list - posiblemente escriba safety – aukm

+0

¿Su función solo necesita tomar argumentos de un tipo o no? –

Respuesta

7

Si sólo necesita aceptar un recuento variable de argumentos del mismo tipo, teniendo un recipiente sería lo más común de hacerlo. Creación del contenedor sin embargo, puede ser aliviado mediante Boost.Assign:

void f(const std::vector<int>& vec) {} 
f(boost::assign::list_of(1)(2)(3)(4)); 

Alternativamente, usted puede ir para la sobrecarga de operadores (por ejemplo, de operator() o operator<<) usted mismo, similar al enfoque adoptado por las corrientes de la biblioteca estándar:

op() << arg1 << arg2 << arg3; 

Si realmente desea proporcionar una función variable de tipo seguro (sin utilizar las funciones de C++ 0x), Boost.Preprocessor puede ayudar. Un ejemplo genérico:

#define OUT(z, n, name) << name ## n 

#define MAKE_FUNC(z, n, unused)          \ 
    template<class T BOOST_PP_ENUM_TRAILING_PARAMS(n, class T)>  \ 
    void func(T t BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(n, T, t)) { \ 
     std::cout << t BOOST_PP_REPEAT(n, OUT, t) << std::endl;  \ 
    } 

BOOST_PP_REPEAT(9, MAKE_FUNC, ~) // generates func() versions taking 1-10 arguments 
func(1, "ab", 'c'); // prints "1abc" 
Cuestiones relacionadas