当前位置:嗨网首页>书籍在线阅读

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...展开为一个函数参数列表。不幸的是,该函数调用与原始函数调用相同,因此它将使用相同的参数不断调用自己,导致无限递归(这存在缺陷)。