Musisz podać przesłonięcia dla funkcji do zużywania pierwszych N
(zazwyczaj jednego) argumentów.
void foo() {
// end condition argument pack is empty
}
template <class First, class... Rest>
void foo(First first, Rest... rest) {
// Do something with first
cout << first << endl;
foo(rest...); // Unpack the arguments for further treatment
}
Po rozpakowaniu parametru variadic znajduje następne przeciążenie.
Przykład:
foo(42, true, 'a', "hello");
// Calls foo with First = int, and Rest = { bool, char, char* }
// foo(42, Rest = {true, 'a', "hello"}); // not the real syntax
Potem następny poziom w dół rozszerzymy poprzedni Rest
i otrzymujemy:
foo(true, Rest = { 'a', "hello"}); // First = bool
I tak dalej, aż Rest
zawiera żadnych członków w tym przypadku rozpakowywania nazywa to foo()
(przeciążenie bez argumentów).
Przechowywanie pakiet jeśli różne typy
Jeśli chcesz zapisać cały argumentem pakować można użyć std::tuple
template <class... Pack>
void store_pack(Pack... p) {
std::tuple<Pack...> store(p...);
// do something with store
}
to jednak wydaje się mniej użyteczne.
Przechowywanie pakiet jeśli jest jednorodny
Jeśli wszystkie wartości w zestawie są tego samego typu można przechowywać je wszystkie tak:
vector<int> reverse(int i) {
vector<int> ret;
ret.push_back(i);
return ret;
}
template <class... R>
vector<int> reverse(int i, R... r) {
vector<int> ret = reverse(r...);
ret.push_back(i);
return ret;
}
int main() {
auto v = reverse(1, 2, 3, 4);
for_each(v.cbegin(), v.cend(),
[](int i) {
std::cout << i << std::endl;
}
);
}
Jednak wydaje nawet mniej użyteczne.
Czego brakowało ci w poprzednim pytaniu? (http://stackoverflow.com/questions/3634379/variadic-templates) A dlaczego nie akceptujesz odpowiedzi na swoje pytania? – ereOn
http://stackoverflow.com/questions/3634379/variadic-templates/3645307#3645307 – kennytm
Odpowiedź powinna znajdować się w połączonym wątku (przez Motti, nie ma awersji?) – visitor