33-展开参数包
18.6.2 展开参数包
但函数如何访问这些包的内容呢?索引功能在这里不适用,即您不能使用Args[2]来访问包中的第三个类型。相反,可将省略号放在函数参数包名的右边,将参数包展开。例如,请看下述有缺陷的代码:
template<typename... Args> // Args is a template parameter pack
void show_list1(Args... args) // args is a function parameter pack
{
show_list1(args...); // passes unpacked args to show_list1()
}
这是什么意思呢?为何说它存在缺陷?假设有如下函数调用:
show_list1(5,'L',0.5);
这将把5、‘L’和0.5封装到args中。在该函数内部,下面的调用:
show_list1(args...);
将展开成如下所示:
show_list1(5,'L',0.5);
也就是说,args被替换为三给存储在args中的值。因此,表示法args...展开为一个函数参数列表。不幸的是,该函数调用与原始函数调用相同,因此它将使用相同的参数不断调用自己,导致无限递归(这存在缺陷)。