Як би один виклик std :: переслати всі аргументи у різноманітній функції?


115

Я просто писав загальну фабрику об'єктів і використовував мета-бібліотеку boost-препроцесора для створення варіативного шаблону (використовуючи 2010, і він їх не підтримує). Моя функція використовує посилання на rval і std::forwardробити ідеальну переадресацію, і це змусило мене задуматися ... коли C ++ 0X вийде, і у мене був стандартний компілятор, я б це робив із реальними шаблонами варіацій. Як би я не закликав std::forwardдо аргументів?

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

Єдиний спосіб, на який я можу подумати, потребував би розпакування вручну ... парам, і я ще не зовсім там. Чи є швидший синтаксис, який би спрацював?

Відповіді:


162

Ви б робили:

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

Практично ...сказано: "візьміть те, що знаходиться зліва, і для кожного параметра шаблону розпакуйте його відповідно".


1
Додайте до цього способи передачі параметрів. Я думаю, що підручники показуютьvoid f(Params&& ...params)
UncleBens

87
У розмові, як я використовую піратський день,void f(Ar&& ...arg)
вовняна

Поясніть, будь ласка, мотивацію вибору рецензії на оцінку && (замість & посилання або просто за значенням залежно від ситуації)
DavidJ

@DavidJ Я сприйняв мотивацію як заперечену питання. Див однак: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.