2010-05-12 4 views
68

J'écrivais juste une fabrique d'objets génériques et j'utilisais la méta-bibliothèque boost preprocessor pour créer un template variadic (en utilisant 2010 et il ne les supporte pas). Ma fonction utilise des références rval et std::forward pour faire un transfert parfait et ça m'a fait penser ... quand C++ 0X sort et que j'avais un compilateur standard, je le ferais avec de vrais templates variadiques. Comment, est-ce que j'appellerais std::forward sur les arguments? La seule façon de penser à cela nécessiterait un déballage manuel de ... params et je ne suis pas encore tout à fait là non plus. Y a-t-il une syntaxe plus rapide qui fonctionnerait?Comment appeler std :: forward sur tous les arguments d'une fonction variadique?

Répondre

103

Vous feriez:

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

Le ... assez bien dit « prendre ce qui est à gauche, et pour chaque paramètre de modèle, décompressez en conséquence. »

+0

Ajoutez à cela comment les paramètres doivent être transmis. Je pense que les tutoriels montrent 'void f (Params && ... params)' – UncleBens

+0

@Uncle: Ajouté, je pense que vous avez raison. – GManNickG

+58

Sur parler comme un jour de pirate j'utilise 'void f (Ar && ... arg)' – woolstar

Questions connexes