定义:将模板参数定义成能接受任意多个模板参数
声明形式:
template <typename T, typename Types…>
变参模板例子:
template<typename T, typename... Types>
void printf(T firstArg, Types... args) {
cout << firstArg << ", ";
printf(args...);
}
其中,firstArg是第一个参数,而args是一个参数包,表示剩余的参数,Types是通过模板参数包定义的类型。可见在printf()函数中通过递归调用printf(args…)来完成剩余参数的打印,因此当递归到printf函数只有一个参数的时候,参数包args为空,此时会调用空的printf函数,因此需要对空的printf函数进行重载从而结束递归。重载参数为空的printf函数如下:
Void printf() {}
完整代码如下:
#include <iostream>
using namespace std;
void printf() {} // 参数为空的printf()函数,用以结束递归
template<typename T, typename... Types>
void printf(T firstArg, Types... args) { // 接受任意多个参数的printf函数
cout << firstArg << ", ";
printf(args...);
}
int main() {
int id = 1;
string name = "Kitty";
int age = 17;
double score = 75;
printf(id, name, age, score);
return 0;
}
执行结果:
上述主函数中printf(id, name, age, score) 可以被变参函数模板推导成以下形式:
printf(int id, string name, int age, double score);
还可利用sizeof…运算符求得参数包中参数的数量,sizeof…(ages)或者sizeof…(Types) 。