C++11的可变参数模板,对参数进行了高度泛化,可以表示任意数目、任意类型的参数
基本语法为
Template<class ... T>void func(T ... args){cout<<”num is”<<sizeof ...(args)<<endl;}
func();//args不含任何参数
func(1);//args包含一个int类型的实参
func(1,2.0)//args包含一个int一个double类型的实参
其中T叫做模板参数包,args叫做函数参数包
省略号作用如下:
1)声明一个包含0到任意个模板参数的参数包
2)在模板定义得右边,可以将参数包展成一个个独立的参数
递归展开法获取模板参数
//递归终止函数 特化的模板函数void print() {cout << "empty" << endl;}//展开函数template <class T, class... Args>void print(T head, Args... rest) {cout << "parameter " << head << endl;print(rest...);}
每一次用rest去特化print,rest中第一个参数会特化T,赋给head,其余参数特化Args,赋给rest
每递归一次rest中的参数个数就少一个,直到最后调用无参数版的递归终止函数。
sum的例子
double Sum2() // 边界条件{return 0;}template<typename T1,typename... T2>double Sum2(T1 t,T2... arg){auto ret = t + Sum2(arg...);return ret;}int main() {auto result = Sum2(1.0,2.5,3,1.9);cout << result;return 0;}
各处的返回值都用auto类型,以防止类型转换带来的问题。
