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?

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”.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.