//模版头
template < typename ... Args> //Args 是模版参数包
void print( Args ... args) //args 是函数参数包
{
print(args...) //展开函数参数包
}
/*
以上是一个可变参数模版的基本写法;
有3个点在 Args与 args 前; 意味这是一个包;
可以理解为 :
...在参数前是 聚合参数
...在参数后是 展开参数
*/
如有一下调用:
print("123",123,4.5);
相当于生成一个 : print(const char*, int,double) 函数实例;
通常可变参数模版是用来递归的.但上面的函数将导致无穷递归;
下面是解决办法;
//main.cpp
//新增的一个模版,用于最后一次打印
template <typename T>
void print(const T& t)
{
cout << t << endl;
}
//原来的模版,修改版
template <typename T , typename ... Args>
//类型前加了const , 以及引用 ; 额外增加了第一个参数t
void print(const T& t, const Args& ... args)
{
cout << t << ' ';
print(args...);
}
//如果有如此调用
print(1,'a',4.5,"nihao");
那么, 'a',4.5,"nihao"3个参数将被聚合.
即第一次调用将输出 1 ;
函数原型:
print(const int&,const char&,const double&,const char*&);
第2次调用将输出 'a';
函数原型:
print(const char&,const double&,const char*&);
每一次从函数参数包中取出一个, 按以上推导,最后一次将调用新增的函数模版;