Il y a deux choses qu'on peut faire avec un variadic pack. Il est possible d'appliquer sizeof...(vs)
pour obtenir le nombre d'éléments et de les développer.
Extension des règles
Use Expansion
Ts... T1, ..., Tn
Ts&&... T1&&, ..., Tn&&
x<Ts,Y>::z... x<T1,Y>::z, ..., x<Tn,Y>::z
x<Ts&,Us>... x<T1&,U1>, ..., x<Tn&,Un>
func(5,vs)... func(5,v1), ..., func(5,vn)
L'Expansion du produit vers l'intérieur vers l'extérieur. Lors de l'extension des deux listes en lock-step, elles doivent avoir la même taille.
D'autres exemples:
gun(A<Ts...>::hun(vs)...);
Développe toutes Ts
dans le modèle de la liste d'arguments d' A
, puis la fonction hun
obtient élargi à tous vs
.
gun(A<Ts...>::hun(vs...));
Développe toutes Ts
dans le modèle de la liste d'arguments d' A
et tous vs
que les arguments de la fonction pour hun
.
gun(A<Ts>::hun(vs)...);
Développe la fonction hun
avec Ts
et vs
en lock-step.
Note:
Ts
n'est pas un type et vs
n'est pas une valeur! Ils sont des alias pour une liste des types de valeurs. Une liste peut être vide. Les deux obéissent qu'à des actions spécifiques. Donc la suite n'est pas possible:
typedef Ts MyList; // error!
Ts var; // error!
auto copy = vs; // error!
L'Expansion des loci
Les arguments de la fonction
template <typename... Ts>
void fun(Ts... vs)
Initialiseur de listes
any a[] = { vs... };
La Base de prescripteurs
template <typename... Ts>
struct C : Ts... {};
template <typename... Ts>
struct D : Box<Ts>... { /**/ };
Membre de l'initialiseur de listes
// Inside struct D
template <typename... Us>
D(Us... vs) : Box<Ts>(vs)... {}
Avec des listes d'arguments
std::map<Ts...> m;
Ne compilera si il y a une correspondance possible pour les arguments.
La Capture de listes
template <class... Ts> void fun(Ts... vs) {
auto g = [&vs...] { return gun(vs...); }
g();
}
Les listes d'attributs
struct [[ Ts... ]] IAmFromTheFurute {};
C'est dans le cahier des charges, mais il n'y a pas d'attribut qui peut être exprimé comme un type, encore.
Ceci est pris à partir de la parole "Variadic Templates sont Funadic" par Andrei Alexandrescu à GoingNavive 2012. Je peux le recommander pour une bonne introdution sur les variadic templates.