C++的新特性–可变模版参数(variadic templates)是C++新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++中最难理解和掌握的特性之一。虽然掌握可变模版参数有一定难度,但是它却是C++11中最有意思的一个特性,本文希望带领读者由浅入深地认识和掌握这一特性,同时也会通过一些实例来展示可变参数模版的一些用法。
变模版参数的展开
可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”。比如我们常常这样声明一个可变模版参数:template
- template <class… T>
- void f(T… args);
省略号的作用:
1.声明一个参数包T… args,这个参数包中可以包含0到任意个模板参数; 2.在模板定义的右边,可以将参数包展开成一个一个独立的参数。
省略号的参数称为“参数包”,它里面包含了0到N(N>=0)个模版参数。我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。
可变模板参数分类:
1.可变模版参数函数
2.可变模版参数类
打印可变模版参数函数的参数个数
- #include <iostream>
- #include <string>
- using namespace std;
- template <class …Type>
- void print(Type …data)
- {
- cout << sizeof…(data) << endl;
- }
- int main()
- {
- print();
- print(1);
- print(1, "ILoveyou");
- print(1, 2, 3.4, "IMissyou");
- return 0;
- }
上面的例子中,print()没有传入参数,所以参数包为空,输出的size为0,后面两次调用分别传入两个和三个参数,故输出的size分别为2和3。由于可变模版参数的类型和个数是不固定的,所以我们可以传任意类型和个数的参数给函数print。这个例子只是简单的将可变模版参数的个数打印出来,如果我们需要将参数包中的每个参数打印出来的话就需要通过一些方法了。
展开可变模版参数函数的方法一般有两种:
1.通过递归函数来展开参数包。
2.逗号表达式来展开参数包。