2013-05-05 15 views
13

Ich sah Code wie dieser früher:Was zwischen tun Vektor <vector<T...> der Unterschied> und Vektor <vector<T> ...>

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

wo T eine variadische Liste der Vorlage Argumente ist. Ich wollte wissen, was der Unterschied zwischen dem Platzieren des Parameterpakets an dem Ende der letzten spitzen Klammer und dem ersten ist. Zum Beispiel:

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

Beide von diesen beiden kompilieren, aber ich weiß nicht, was der Unterschied ist.

Kann jemand erklären? Vielen Dank.

Antwort

23

In einer Packung Expansion das Muster, das die ... voran für jedes Element des Satzes wiederholt wird, so erweitern vector<T>... Mittel in vector<T1>, vector<T2>, vector<T3> während vector<T...> Mittel expandieren in vector<T1, T2, T3>

Wenn der Parameter Packung nur ein Element hat, sie sind die gleichen, aber denken sie daran, wenn der Parameter Pack zwei Elemente hat, sollte es klar sein, dass

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

und

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

sind nicht gleich. Der erste Template-Parameter wird nicht kompiliert, der zweite Template-Parameter für std::vector muss ein Zuordnungstyp sein, kein Vektor. Der zweite wird kompiliert, wenn T2 ein Zuordnungstyp ist.

8

Wenn A<T1, T2, T3> instanziiert wird, wird es erweitert:

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

die gleiche Vorlage Argumente Mit B instanziiert, erhalten Sie:

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

Und weder würde – Praetorian

+3

kompilieren @Praetorian du hast Recht. Ich glaube jedoch, dass OP mehr daran interessiert ist, wie die Parameterpakete erweitert werden. – mfontanini

Verwandte Themen