2010-09-18 13 views
8

Volevo scrivere una funzione con una lista di argomenti variabili. Voglio esplorare le mie opzioni. Sono abbastanza sicuro di essere arrivato in una classe di template boost progettata per questo scopo, ma non riesco a pensare al nome di questo? Qualcuno può dirmelo? o ho sognato questo! GrazieElenchi di argomenti variabili con boost?

+0

Si intende conteggio argomento variabile ma un tipo o anche tipi arbitrari? –

+0

Non sono sicuro di quale sia esattamente la libreria fornita, non riesco a trasferirla, immagino sia stata una sorta di miglioramento rispetto a va_list - possibilmente digitare la sicurezza – aukm

+0

La tua funzione ha solo bisogno di prendere argomenti di un tipo o no? –

risposta

7

Se è necessario accettare solo un numero variabile di argomenti dello stesso tipo, prendere un contenitore sarebbe la cosa comune da fare. La creazione del contenitore tuttavia può essere alleviato con Boost.Assign:

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

In alternativa si può andare per l'overloading degli operatori (ad esempio di operator() o operator<<) da soli, in modo simile a quello adottato dai torrenti della libreria standard:

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

Se si desidera fornire una funzione variadic sicura al tipo (senza utilizzare le funzioni C++ 0x), è possibile utilizzare Boost.Preprocessor. Un esempio generico:

#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" 
Problemi correlati