如何对可变参数函数中的所有参数调用std :: forward?


114

我只是在编写一个通用对象工厂,并使用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,而且我也还没有。有没有一种更快的语法可以工作?

Answers:


161

您可以这样做:

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

...相当多说,“采取什么样的左边,并为每个模板参数,因此解压。”


1
此外,应如何传递参数。我认为教程显示void f(Params&& ...params)
UncleBens 2010年

87
在谈话中,我使用的是海盗般的日子void f(Ar&& ...arg)
Woolstar 2014年

请解释选择右值引用&&的动机(而不是&引用或仅根据情况根据值)
DavidJ

@DavidJ我已将动机归结为一个问题。但是请参阅:stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.