2010-09-18 5 views
8

Ich wollte eine Funktion mit einer variablen Argumentliste schreiben. Ich möchte meine Möglichkeiten erkunden. Ich bin mir ziemlich sicher, dass ich über eine Boost-Template-Klasse gekommen bin, die für diesen Zweck entwickelt wurde, aber ich kann mir den Namen nicht vorstellen. Kann mir das jemand sagen? oder habe ich das geträumt? DankVariable Argumentlisten mit Boost?

+0

Sie meinen variable Argumentanzahl aber einen Typ oder auch beliebige Typen? –

+0

Ich bin mir nicht sicher, was genau die Bibliothek zur Verfügung gestellt hat, ich kann es nicht verschieben, ich denke, es war eine Art Verbesserung gegenüber va_list - möglicherweise Typ Sicherheit – aukm

+0

Muss Ihre Funktion nur Argumente eines Typs annehmen oder nicht? –

Antwort

7

Wenn Sie nur eine variable Anzahl von Argumenten des gleichen Typs akzeptieren müssen, wäre die Einnahme eines Containers das Übliche. jedoch Schaffung des Behälters kann Boost.Assign mit gelockert werden:

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

Alternativ Sie für Betreiber Überlastung (zB von operator() oder operator<<) gehen kann, sich, ähnlich dem Vorgehen der Standardbibliothek Ströme genommen:

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

Wenn Sie wirklich eine typsichere Variadic-Funktion (ohne Verwendung von C++ 0x-Funktionen) bereitstellen möchten, kann Boost.Preprocessor helfen. Ein generisches Beispiel:

#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" 
Verwandte Themen