¿Cómo se llamaría std :: forward en todos los argumentos en una función variadic?

114

Estaba escribiendo una fábrica de objetos genéricos y usando la metabiblioteca del preprocesador de impulso para hacer una plantilla variadic (usando 2010 y no los admite). Mi función usa referencias rval y std::forwardpara hacer un reenvío perfecto y me hizo pensar ... cuando salga C ++ 0X y tuviera un compilador estándar, haría esto con plantillas variadas reales. Sin embargo, ¿cómo podría recurrir std::forwarda los argumentos?

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 la que puedo pensar requeriría el desempaquetado manual de ... parámetros y tampoco he llegado todavía. ¿Existe una sintaxis más rápida que funcione?

Edward extraño
fuente

Respuestas:

161

Tu harías:

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

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

GManNickG
fuente
1
Agregue a eso cómo se deben pasar los parámetros. Creo que se muestran los tutorialesvoid f(Params&& ...params)
UncleBens
87
Hablo como un día pirata que usovoid f(Ar&& ...arg)
Woolstar
Explique la motivación de la elección de rvalue reference && (en lugar de & reference o simplemente por valor según la situación)
DavidJ
@DavidJ He tomado la motivación como parte de la pregunta. Sin embargo, consulte: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG