Как можно вызвать std :: forward для всех аргументов в функции с переменным числом аргументов? - PullRequest
91 голосов
/ 12 мая 2010

Я только что написал общую фабрику объектов и использовал метабиблиотеку препроцессора 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.
}

Единственный способ, которым я могу придумать, - это распаковать вручную ... params, и я еще не совсем там. Есть ли более быстрый синтаксис, который будет работать?

1 Ответ

130 голосов
/ 12 мая 2010

Вы бы сделали:

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

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

...