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

149

我刚刚在编写一个通用对象工厂,并使用boost预处理器元库来制作可变参数模板(使用2010年的版本,它不支持它们)。我的函数使用右值引用和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个回答

218

你需要执行以下操作:

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

... 的意思是“取左边的内容,然后对于每个模板参数,相应地展开它们。”


1
此外,还需要考虑参数应该如何传递。我认为教程中展示了 void f(Params&& ...params) - UncleBens
124
在“像海盗一样说话日”,我使用void f(Ar&& ...arg)。 (注: Talk Like a Pirate Day是每年9月19日庆祝的节日,人们在这一天模仿海盗的语言和行为举止。void f(Ar&& ...arg)是一段C++代码,涉及到可变参数模板函数的声明。) - woolstar
1
@DavidJ 我已将动机视为问题的内在部分。但请参考:https://dev59.com/m3A65IYBdhLWcg3w4C2j - GManNickG
我真的无法理解...应该放在哪里的想法。 - Nick
6
在这种情况下,&&并不是右值引用,而是转发(或通用)引用。在与模板一起使用时,它可以绑定到任何引用类型。详细信息请参见https://blog.petrzemek.net/2016/09/17/universal-vs-forwarding-references-in-cpp/。 - David Woo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接