Comment appeler std :: forward sur tous les arguments d'une fonction variadique?

115

J'écrivais juste une fabrique d'objets génériques et j'utilisais la méta-bibliothèque du préprocesseur boost pour créer un modèle variadique (en utilisant 2010 et cela ne les prend pas en charge). Ma fonction utilise des références rval et std::forwardpour faire un transfert parfait et cela m'a fait réfléchir ... quand C ++ 0X sortait et que j'avais un compilateur standard, je le ferais avec de vrais modèles variadiques. Mais comment pourrais-je invoquer std::forwardles arguments?

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

La seule façon dont je peux penser nécessiterait un déballage manuel de ... paramètres et je n'y suis pas encore tout à fait non plus. Existe-t-il une syntaxe plus rapide qui fonctionnerait?

Edward étrange
la source

Réponses:

162

Vous feriez:

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

Le ...dit à peu près "prenez ce qui est à gauche, et pour chaque paramètre de modèle, décompressez-le en conséquence."

GManNickG
la source
1
Ajoutez à cela comment les paramètres doivent être passés. Je pense que les tutoriels montrentvoid f(Params&& ...params)
UncleBens
87
On parle comme un jour de pirate que j'utilisevoid f(Ar&& ...arg)
Woolstar
Veuillez expliquer la motivation du choix de rvalue reference && (au lieu de & reference ou simplement par valeur selon la situation)
DavidJ
@DavidJ J'ai pris la motivation comme ancrée dans la question. Voir cependant: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG