可变参数模板的概念
可变参数是C++11新增的比较重要的特性之一
它对参数高度泛化 能够让我们创建接受可变参数的函数模板还有类模板
- 在C++11之前模板只能使用固定个数参数 所以可变参数模板特性无疑是一个巨大的进步 但是可变参数模板比较抽象 使用起来需要一定的技巧
- 其实在C++11之前就已经有了可变参数这个概念 比如说库函数中的printf函数 它就可以接受多个参数 但是这只是函数参数的可变参数 并不是模板的可变参数
可变参数模板的定义方式
在C++11中 可变参数模板的定义方式如下
template<class …Args> 返回类型 函数名(Args… args) { //函数体 }
我们写出一个特化版本的函数
template<class ...Args> void ShowList(Args... args) {}
对于上面的代码我们这里予以解释
- 模板参数 …Args 前面的省略号代表这是一个可变参数模板 我们将带有省略号的参数称为参数包 参数包里面可以有0~N(N > 0)个参数 args是参数包的形参
- 它们的名字并不是一定要叫Args和args 可以修改为别的名称
使用了这个模板之后我们就可以使用多种参数来调用这个函数
ShowList(); ShowList(1); ShowList(1, 'A'); ShowList(1, 'A', string("hello"));
我们还可以通过sizeof来计算函数到底调用了多少个参数
template<class ...Args> void ShowList(Args... args) { cout << sizeof...(args) << endl; }
这里有一点特别重要 sizeof后面的…不能省略 否则编译器会报错
修改正确后的运行结果如下
虽然我们能很简单的通过sizeof关键字来获取参数包中参数的个数
但是我们缺很难知道参数包中每个参数的类型 这也是参数包使用中的一大难点
需要注意的是 我们不能通过下标访问操作符【】来访问参数包
接下来我们会介绍两种获取参数包中各个参数的方式