c++11 szablony ze zmienna liczba argumentów;

1

Znalazłem taki przykład w książce C++11 Andrzeja Stasiewicza:

 #include <iostream>
using namespace std;

template<typename T>
void wypisz(T t){
    cout << t << endl;
}

template<typename T, typename ...Typy>
void wypisz(T t, Typy... tt){
    if(sizeof...(tt) > 0)
        wypisz(tt...);
}

int main(){
    wypisz(1, "Mruszek", "Burek", 3.14);
    wypisz("aaa", 3, 4);
}

W książce jest napisane, że program wypisuje wszystkie argumenty przekazane do funkcji a mi wypisuje tylko ostatni element. Dlaczego ?

5

Może dlatego że nie wypisujesz argumentu który dostajesz? :-)

#include <iostream>
using namespace std;
 
template<typename T>
void wypisz(T t){
    cout << t ;
}
 
template<typename T, typename ...Typy>
void wypisz(T t, Typy... tt){
    wypisz(t);
    cout << ", ";
    wypisz(tt...);
    cout << endl;
}
 
int main(){
    wypisz(1, "Mruszek", "Burek", 3.14);
    wypisz("aaa", 3, 4);
}
0

Dzięki :)

EDIT:
A dlaczego to ma znaczenie? Dlaczego nie mogę wypisać tylko drugiego argumenty (Typy... tt)?

0

Bo wtedy otrzymujesz rekurencję z sobą cały czas:

void wypisz(T t, Typy... tt){
    if(sizeof...(tt) > 0)
        wypisz(tt...);
}

A ta rekurencja kończy się dopiero wtedy, gdy tt... będzie jednym argumentem i wykonywanie kodu przejdzie do void wypisz(T t){

4

@Patryk27 tu jest rekurencja, ale na poziomie szablonu! Ergo ten if jest zbędny, bo rekurencję kończy pierwszy szablon.
http://ideone.com/1UdmCC

1 użytkowników online, w tym zalogowanych: 0, gości: 1