2013-05-05 11 views
13

Ho visto il codice come questo in precedenza:Qual è la differenza tra fare vettore <vector<T...>> e vettoriale <vector<T> ...>

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

dove T è una lista di argomenti variadic template. Volevo sapere qual è la differenza tra mettere il pacchetto di parametri alla fine dell'ultima parentesi angolare e il primo. Ad esempio:

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

Entrambe queste due vanno bene ma non so quale sia la differenza.

Qualcuno può spiegare? Grazie.

risposta

23

In un pacchetto di espansione del modello che precede il ... viene ripetuta per ogni elemento della confezione, in modo vector<T>... mezzi espandersi in vector<T1>, vector<T2>, vector<T3> mentre vector<T...> mezzi espandersi in vector<T1, T2, T3>

Se il parametro confezione ha un solo elemento sono lo stesso, ma considerare se il parametro confezione ha due elementi, dovrebbe essere ovvio che

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

e

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

non sono la stessa cosa. Il primo non verrà compilato, il secondo parametro modello per std::vector deve essere un tipo di allocatore, non un vettore. Il secondo verrà compilato se T2 è un tipo di allocatore.

8

Quando un'istanza A<T1, T2, T3>, è estesa a:

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

Utilizzando gli stessi argomenti di template per creare un'istanza di B, si ottiene:

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

E nessuno dei due avrebbe compilare – Praetorian

+3

@Praetorian hai ragione. Tuttavia, credo che OP sia più interessato a come i pacchetti di parametri vengono espansi. – mfontanini

Problemi correlati