SHAMELESS COPY [approved by its source]
参数组可以只能在严格定义的上下文列表中扩展,并且运算符,
不是其中之一。换句话说,不可能使用包扩展来生成由运算符,
分隔的一系列子表达式组成的表达式。
经验法则是“扩展可以生成,
-分离的模式列表,其中,
是列表分隔符。”运算符,
不构造语法意义上的列表。
要呼吁每一个参数的函数,你可以使用递归(这是在可变参数模板编程的盒子的主要工具):
#include <utility>
template<typename T>
void foo(T &&t){}
template<typename Arg0, typename Arg1, typename ... Args>
void foo(Arg0 &&arg0, Arg1 &&arg1, Args &&... args){
foo(std::forward<Arg0>(arg0));
foo(std::forward<Arg1>(arg1), std::forward<Args>(args)...);
}
auto main() -> int{
foo(1, 2, 3, "3");
}
有用的非复制的信息
你可能还没有在这个答案中看到的另一件事是使用&&
说明符和std::forward
。在C++中,&&
说明符可以表示以下两种情况之一:右值引用或通用引用。
我不会进入右值引用,但有人使用可变参数模板;普遍的参考文献是上帝派来的。
完美转发
一个std::forward
和普遍引用的用途是类型的其他功能完美转发。
在您的例子,如果我们通过一个int&
到foo2
它会自动降级为int
,因为模板扣除后所产生的foo2
功能的签名,如果你想要再往前这个arg
到将修改它的另一个功能ny引用,你会得到不想要的结果(该变量不会被改变),因为foo2
将通过传递一个int
给它传递一个临时引用。为了解决这个问题,我们指定一个转发功能,将任意类型的参考转换为变量(右值为或左值)。然后,为了确保我们传递的转发函数中传递的确切类型,我们使用std::forward
,然后只有那么我们是否允许降级类型;因为我们现在处于最重要的地步。
如果需要,请阅读universal references和perfect forwarding;斯科特迈尔斯作为一种资源相当出色。
如果'Args'为空? – CoffeeandCode 2014-09-05 07:28:15