Nel contesto del modello variadico, i puntini di sospensione ...vengono utilizzati per decomprimere il pacchetto di parametri del modello se appare sul lato destro di un'espressione (chiamare questo modello di espressione per un momento). La regola è che qualsiasi modello si trova sul lato sinistro di ...viene ripetuto: i modelli decompressi (chiamali ora espressioni ) sono separati da virgola ,.
Può essere meglio compreso con alcuni esempi. Supponi di avere questo modello di funzione:
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)
}
Ora, se chiamo questa funzione passando Tcome {int, char, short}, ciascuna chiamata di funzione viene espansa come:
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) );
Nel codice che hai pubblicato, std::forwardsegue il quarto schema illustrato dalla n()chiamata di funzione.
Nota la differenza tra x(args)...e y(args...)sopra!
È possibile utilizzare ...per inizializzare un array anche come:
struct data_info
{
boost::any data;
std::size_t type_size;
};
std::vector<data_info> v{{args, sizeof(T)}...}; //pattern = {args, sizeof(T)}
che è ampliato a questo:
std::vector<data_info> v
{
{arg0, sizeof(int)},
{arg1, sizeof(char)},
{arg2, sizeof(short)}
};
Mi sono appena reso conto che un pattern potrebbe anche includere identificatori di accesso come public, come mostrato nell'esempio seguente:
template<typename ... Mixins>
struct mixture : public Mixins ... //pattern = public Mixins
{
//code
};
In questo esempio, il modello viene espanso come:
struct mixture__instantiated : public Mixin0, public Mixin1, .. public MixinN
Cioè, mixturederiva pubblicamente da tutte le classi di base.
Spero che aiuti.
...viene prima dell'identificatore introdotto. Quando si utilizzano uno o entrambi i tipi di pacchetti,...viene visualizzato dopo il modello di espressione da espandere.