2010-09-18 20 views
8

Chciałem napisać funkcję ze zmienną listą argumentów. Chcę poznać moje opcje. Jestem prawie pewien, że przeszedłem przez klasę szablonów doładowania, która została zaprojektowana do tego celu, ale nie mogę wymyślić jej nazwy? Czy ktoś może mi powiedzieć? czy ja to wymyśliłem? DziękiListy zmiennych zmiennych z doładowaniem?

+0

Masz na myśli zmienną liczbę argumentów, ale jeden typ, czy też dowolne typy? –

+0

Nie jestem pewien, co dokładnie zapewniła biblioteka, nie mogę go przenieść, wydaje mi się, że była to jakaś poprawa w stosunku do va_list - prawdopodobnie bezpieczeństwa typu – aukm

+0

Czy twoja funkcja musi tylko przyjmować argumenty jednego typu, czy nie? –

Odpowiedz

7

Jeśli musisz zaakceptować zmienną liczbę argumentów tego samego typu, podjęcie zwykłego pojemnika byłoby bardzo proste. Stworzenie pojemnika jednak można złagodzić stosując Boost.Assign:

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

Alternatywnie można przejść do operatora przeciążenia (np operator() lub operator<<) siebie, podobne do podejścia przyjętego przez standardowe strumienie Biblioteka:

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

Jeśli naprawdę chcesz zapewnić bezpieczną dla typu funkcję językową (bez użycia funkcji C++ 0x), pomocna może być Boost.Preprocessor. Ogólny przykład:

#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" 
Powiązane problemy