Как можно вызвать std :: forward для всех аргументов в вариативной функции?


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)
Woolstar

Пожалуйста, объясните мотивацию выбора ссылки rvalue && (вместо & reference или просто по значению в зависимости от ситуации)
DavidJ

@DavidJ Я понял, что мотивация заложена в вопросе. См. Однако: stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.