2010-09-18 4 views
8

Je voulais écrire une fonction avec une liste d'arguments variable. Je veux explorer mes options. Je suis à peu près sûr que je suis tombé sur une classe de modèle de boost qui a été conçue à cet effet, mais je ne peux pas penser à son nom? Quelqu'un peut-il me dire? ou ai-je rêvé cela! MerciListes d'arguments variables avec boost?

+0

Vous voulez dire le nombre d'arguments variable mais un type, ou des types arbitraires? –

+0

Je ne sais pas exactement ce que la bibliothèque a fourni, je ne peux pas sembler le déplacer, je suppose que c'était une sorte d'amélioration par rapport à va_list - éventuellement par sécurité – aukm

+0

Est-ce que votre fonction doit uniquement prendre des arguments? –

Répondre

7

Si vous avez seulement besoin d'accepter un nombre variable d'arguments du même type, prendre un conteneur serait la chose la plus courante. Création du conteneur peut toutefois être assoupli en utilisant Boost.Assign:

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

Sinon, vous pouvez opter pour une surcharge opérateur (par exemple de operator() ou operator<<) vous, semblable à l'approche adoptée par les cours d'eau de la bibliothèque standard:

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

Si vous voulez vraiment fournir une fonction variadique de type sécurité (sans utiliser les fonctionnalités C++ 0x), Boost.Preprocessor peut vous aider. Un exemple générique:

#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" 
Questions connexes