2013-05-05 43 views
13

widziałem wcześniej takiego kodu:Jaka jest różnica między robi wektor <vector<T...>> i grafika <vector<T> ...>

using A = std::vector<std::vector<T>...> 

gdzie T jest lista argumentów o zmiennej liczbie argumentów szablonu. Chciałem się dowiedzieć, jaka jest różnica między umieszczeniem zestawu parametrów na końcu ostatniego nawiasu a pierwszym. Na przykład:

using B = std::vector<std::vector<T...>>; 

Obie te kompilacje dobrze, ale nie wiem jaka jest różnica.

Czy ktoś może wyjaśnić? Dzięki.

Odpowiedz

23

W dodatku wzór, który poprzedza ... jest powtarzany dla każdego elementu opakowania, tak vector<T>... środki ekspansję vector<T1>, vector<T2>, vector<T3>, natomiast vector<T...> pomocą ekspansję vector<T1, T2, T3>

Jeśli zestaw parametrów zawiera tylko jeden element którą są takie same, ale zastanowić się, czy opakowanie parametr ma dwa elementy, to powinno być oczywiste, że

std::vector<std::vector<T1>, std::vector<T2>> 

i

std::vector<std::vector<T1, T2>> 

to nie to samo. Pierwszy nie zostanie skompilowany, drugi parametr szablonu dla std::vector musi być typem alokatora, a nie wektorem. Drugi skompiluje się, jeśli T2 jest typem alokatora.

8

Przy uruchamianiu A<T1, T2, T3>, jest rozszerzony:

std::vector<std::vector<T1>, std::vector<T2>, std::vector<T3>> 

Stosując te same argumenty szablonów instancji B dostaniesz:

std::vector<std::vector<T1, T2, T3>> 
+2

I nie byłoby skompilować – Praetorian

+3

@Praetorian masz rację. Uważam jednak, że OP jest bardziej zainteresowany rozszerzaniem pakietów parametrów. – mfontanini

Powiązane problemy