2010-05-12 13 views
68

Estaba escribiendo una fábrica de objetos genéricos y utilizando la metabiblioteca del preprocesador boost para crear una plantilla variadica (utilizando 2010 y no los admite). Mi función utiliza referencias de rval y std::forward para hacer un reenvío perfecto y me hizo pensar ... cuando salga C++ 0X y tuviera un compilador estándar lo haría con plantillas variadic reales. ¿Cómo, sin embargo, llamaría al std::forward sobre los argumentos?¿Cómo se podría llamar a std :: forward en todos los argumentos en una función variadica?

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 única forma en que puedo pensar requerirá el desempaque manual de ... params y todavía no estoy allí todavía. ¿Hay una sintaxis más rápida que funcionaría?

Respuesta

103

Harías:

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

El ... dice más o menos "Toma lo que es a la izquierda, y para cada parámetro de plantilla, descomprimirlo en consecuencia."

+0

Agregue a eso cómo se deben pasar los parámetros. Creo que los tutoriales muestran 'void f (Params && ... params)' – UncleBens

+0

@Uncle: Añadido, creo que tienes razón. – GManNickG

+58

Hablando como un día de pirata, uso 'void f (Ar && ... arg)' – woolstar

Cuestiones relacionadas