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 T
come {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::forward
segue 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è, mixture
deriva 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.