template <typename ... ARGS> void fun(ARGS ... args)
首先明白几个概念
1,模板參数包(template parameter pack):它指模板參数位置上的变长參数,比如上面样例中的ARGS
2,函数參数包(function parameter pack):它指函数參数位置上的变长參数。比如上面样例中的args
普通情况下 參数包必须在最后面,比如:
template <typename T, typename ... Args> void fun(T t,Args ... args);//合法 template <typename ... Args, typename T> void fun(Args ... args,T t);//非法
有一个新的运算符:sizeof...(T) 能够用来获知參数包中打包了几个參数,注意 不是 參数所占的字节数之和。
#include <iostream> using namespace std; template <typename ...Args> //Args:模板參数包 void func(Args ...args) //args:函数參数包 { cout << sizeof...(args) << endl; } int main() { func(1, 2, 3, 4, 5); //输出5 return 0; }
函数实例
一个经常使用的技巧是:利用模板推导机制,每次从參数包里面取第一个元素,缩短參数包,直到包为空。
#include <iostream> using namespace std; template <typename T> void func(const T& t) { cout << t << endl; } template <typename T, typename ...Args> //Args:模板參数包 void func(const T& t, Args ...args) //args:函数參数包 { cout << t << endl; func(args...); } int main() { func(1, 2, 3, 4, 5); return 0; }