Jak można wywołać std :: forward dla wszystkich argumentów w funkcji wariadycznej?

115

Właśnie pisałem generyczną fabrykę obiektów i korzystałem z meta-biblioteki preprocesora boost, aby stworzyć szablon wariadyczny (używając 2010 i nie obsługuje ich). Moja funkcja korzysta z referencji rval i std::forwardaby wykonać doskonałe przekazywanie, i pomyślałem ... kiedy pojawi się C ++ 0X i mam standardowy kompilator, zrobiłbym to z prawdziwymi szablonami wariadycznymi. Jak jednak miałbym odwołać std::forwardsię do argumentów?

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

Jedyny sposób, o którym mogę pomyśleć, wymagałby ręcznego rozpakowania ... parametrów, a ja też jeszcze nie jestem. Czy istnieje szybsza składnia, która działałaby?

Edward Strange
źródło

Odpowiedzi:

162

Ty byś zrobił:

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

To ...prawie mówi „weź to, co jest po lewej stronie i rozpakuj go odpowiednio dla każdego parametru szablonu”.

GManNickG
źródło
1
Dodaj do tego, w jaki sposób parametry powinny być przekazywane. Myślę, że tutoriale pokazująvoid f(Params&& ...params)
UncleBens
87
W rozmowie jak w piracki dzień używamvoid f(Ar&& ...arg)
woolstar
Proszę wyjaśnić motywację wyboru r-wartości odniesienia && (zamiast & odniesienia lub po prostu wartością w zależności od sytuacji)
DavidJ
@DavidJ Podjąłem motywację w pytaniu. Zobacz jednak: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG