Como alguém chamaria std :: forward em todos os argumentos em uma função variadic?

115

Eu estava apenas escrevendo uma fábrica de objetos genéricos e usando a meta-biblioteca do pré-processador boost para fazer um modelo variável (usando 2010 e não os suporta). Minha função usa referências rval std::forwardpara fazer um encaminhamento perfeito e isso me fez pensar ... quando C ++ 0X fosse lançado e eu tivesse um compilador padrão, faria isso com modelos reais variadic. Mas como, eu invocaria std::forwardos 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.
}

A única maneira que consigo imaginar seria a descompactação manual de ... params e também não cheguei lá ainda. Existe uma sintaxe mais rápida que funcionaria?

Edward Strange
fonte

Respostas:

162

Você faria:

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

O que ...basicamente diz "pegue o que está à esquerda e, para cada parâmetro do modelo, descompacte-o de acordo."

GManNickG
fonte
1
Adicione a isso como os parâmetros devem ser passados. Acho que os tutoriais mostramvoid f(Params&& ...params)
UncleBens
87
Eu uso um dia de conversa como um piratavoid f(Ar&& ...arg)
Woolstar
Explique a motivação da escolha da referência de rvalue && (em vez de & reference ou apenas por valor dependendo da situação)
DavidJ
@DavidJ Considerei a motivação embutida na pergunta. Consulte, no entanto: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG