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

Posted

技术标签:

【中文标题】如何对可变参数函数中的所有参数调用 std::forward ?【英文标题】:How would one call std::forward on all arguments in a variadic function? 【发布时间】:2011-02-18 18:10:45 【问题描述】:

我只是在编写一个通用对象工厂并使用 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】:

你会这样做:

template <typename ...Params>
void f(Params&&... params)

    y(std::forward<Params>(params)...);

... 几乎说“取左边的内容,并为每个模板参数相应地解包。”

【讨论】:

添加参数应该如何传递。我认为教程显示void f(Params&amp;&amp; ...params) 谈天说地我用void f(Ar&amp;&amp; ...arg) 请解释选择右值引用 && 的动机(而不是 & 引用或仅根据情况按值) @DavidJ 我将动机作为问题的一部分。但是请参阅:***.com/questions/3582001/advantages-of-using-forward @DavidJ 在这种情况下 && 不是右值引用,而是转发(或通用)引用。当与模板一起使用时,它可以绑定到任何引用类型。 blog.petrzemek.net/2016/09/17/…

以上是关于如何对可变参数函数中的所有参数调用 std::forward ?的主要内容,如果未能解决你的问题,请参考以下文章

这个可变参数列表函数调用是如何工作的?

如何调用所有可变继承类的函数?

在Javascript中的可变参数函数内调用可变参数函数?

C语言中如何实现可变参函数

Python中的函数参数:位置参数默认参数可变参数关键字参数和命名关键字参数

C语言奇淫技巧之函数的可变参数