2010-05-12 5 views
68

Właśnie napisałem ogólną fabrykę obiektów i używając metadiblioteki preprocessora boost, utworzyłem szablon variadic (używając 2010 i nie obsługuje ich). Moja funkcja używa referencji rval i std::forward, aby wykonać perfekcyjne przekazywanie i przyszło mi do głowy ... kiedy wychodzi C++ 0X i miałem standardowy kompilator, robiłbym to z prawdziwymi szablonami variadic. Jak jednak, czy mogę nazwać argumenty na std::forward?W jaki sposób wywołać std :: forward dla wszystkich argumentów w funkcji variadic?

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

Jedynym sposobem mogę myśleć wymaga ręcznego rozpakowywanie ... params i nie jestem całkiem tam jeszcze obaj. Czy istnieje szybsza składnia, która działałaby?

Odpowiedz

103

byłoby to zrobić:

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

... dość dużo mówi „bierz co jest po lewej stronie, a dla każdego parametru szablonu, rozpakować go odpowiednio.”

+0

Dodaj do tego, jak parametry powinny być przekazywane. Myślę, że tutoriale pokazują 'void f (Params && ... params)' – UncleBens

+0

@ Wuj: Dodano, myślę, że masz rację. – GManNickG

+58

W rozmowach takich jak pirackie dni używam 'void f (Ar && ... arg)' – woolstar

Powiązane problemy