C++11的可变参数模板,对参数进行了高度泛化,可以表示任意数目、任意类型的参数
    基本语法为

    1. Template<class ... T>
    2. void func(T ... args)
    3. {
    4. cout<<”num is”<<sizeof ...(args)<<endl;
    5. }

    func();//args不含任何参数
    func(1);//args包含一个int类型的实参
    func(1,2.0)//args包含一个int一个double类型的实参
    其中T叫做模板参数包,args叫做函数参数包
    省略号作用如下:
    1)声明一个包含0到任意个模板参数的参数包
    2)在模板定义得右边,可以将参数包展成一个个独立的参数

    递归展开法获取模板参数

    1. //递归终止函数 特化的模板函数
    2. void print() {
    3. cout << "empty" << endl;
    4. }
    5. //展开函数
    6. template <class T, class... Args>
    7. void print(T head, Args... rest) {
    8. cout << "parameter " << head << endl;
    9. print(rest...);
    10. }

    每一次用rest去特化print,rest中第一个参数会特化T,赋给head,其余参数特化Args,赋给rest
    每递归一次rest中的参数个数就少一个,直到最后调用无参数版的递归终止函数。
    sum的例子

    1. double Sum2() // 边界条件
    2. {
    3. return 0;
    4. }
    5. template<typename T1,typename... T2>
    6. double Sum2(T1 t,T2... arg)
    7. {
    8. auto ret = t + Sum2(arg...);
    9. return ret;
    10. }
    11. int main() {
    12. auto result = Sum2(1.0,2.5,3,1.9);
    13. cout << result;
    14. return 0;
    15. }

    各处的返回值都用auto类型,以防止类型转换带来的问题。