Dans le contexte du modèle variadique, les points de suspension ...
sont utilisés pour décompresser le pack de paramètres du modèle s'il apparaît sur le côté droit d'une expression (appelez ce modèle d' expression pendant un moment). La règle est que tout motif se trouvant sur le côté gauche de ...
est répété - les motifs décompressés (appelez-les maintenant expressions ) sont séparés par des virgules ,
.
Il peut être mieux compris par quelques exemples. Supposons que vous ayez ce modèle de fonction:
template<typename ...T>
void f(T ... args)
{
g( args... ); //pattern = args
h( x(args)... ); //pattern = x(args)
m( y(args...) ); //pattern = args (as argument to y())
n( z<T>(args)... ); //pattern = z<T>(args)
}
Maintenant, si j'appelle cette fonction en passant T
comme {int, char, short}
, alors chacun des appels de fonction est développé comme:
g( arg0, arg1, arg2 );
h( x(arg0), x(arg1), x(arg2) );
m( y(arg0, arg1, arg2) );
n( z<int>(arg0), z<char>(arg1), z<short>(arg2) );
Dans le code que vous avez publié, std::forward
suit le quatrième modèle illustré par n()
l'appel de fonction.
Notez la différence entre x(args)...
et y(args...)
au - dessus!
Vous pouvez également utiliser ...
pour initialiser un tableau comme:
struct data_info
{
boost::any data;
std::size_t type_size;
};
std::vector<data_info> v{{args, sizeof(T)}...}; //pattern = {args, sizeof(T)}
qui est étendu à ceci:
std::vector<data_info> v
{
{arg0, sizeof(int)},
{arg1, sizeof(char)},
{arg2, sizeof(short)}
};
Je viens de réaliser qu'un modèle pourrait même inclure un spécificateur d'accès tel que public
, comme indiqué dans l'exemple suivant:
template<typename ... Mixins>
struct mixture : public Mixins ... //pattern = public Mixins
{
//code
};
Dans cet exemple, le modèle est développé comme:
struct mixture__instantiated : public Mixin0, public Mixin1, .. public MixinN
Autrement dit, mixture
dérive publiquement de toutes les classes de base.
J'espère que cela pourra aider.
...
vient avant que l'identifiant soit introduit. Lors de l'utilisation de l'un ou des deux types de packs, le...
se trouve après le modèle d'expression à développer.