Come si chiamerebbe std :: forward su tutti gli argomenti in una funzione variadica?


115

Stavo solo scrivendo una fabbrica di oggetti generica e utilizzando la meta-libreria del preprocessore boost per creare un modello variadico (utilizzando il 2010 e non li supporta). La mia funzione utilizza riferimenti rval e std::forwardper eseguire un inoltro perfetto e mi ha fatto pensare ... quando uscirà C ++ 0X e avessi un compilatore standard, lo farei con veri modelli variadici. Ma come posso richiamare std::forwardgli argomenti?

template <typename ...Params>
void f(Params... params) // how do I say these are rvalue reference?
{
    y(std::forward(...params)); //? - I doubt this would work.
}

L'unico modo in cui riesco a pensare richiederebbe il disimballaggio manuale di ... params e non ci sono ancora del tutto. Esiste una sintassi più rapida che funzioni?

Risposte:


162

Faresti:

template <typename ...Params>
void f(Params&&... params)
{
    y(std::forward<Params>(params)...);
}

Il ...più o meno dice "prendi ciò che è a sinistra e, per ogni parametro del modello, scompattalo di conseguenza".


1
Aggiungete a ciò come devono essere passati i parametri. Penso che i tutorial mostrinovoid f(Params&& ...params)
UncleBens

87
Parlo come un giorno da pirata che usovoid f(Ar&& ...arg)
Woolstar

Si prega di spiegare la motivazione della scelta del riferimento rvalue && (invece di & riferimento o solo per valore a seconda della situazione)
DavidJ

@DavidJ Ho preso la motivazione come parte integrante della domanda. Vedere però: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.