C++ 可变参数模板(Variadic Templates)
C++11 新标准提出 可变参数模板的概念。它支持 模板参数包、函数参数类型包、函数参数包。"包" 的语法为 ... 。
一、基本概念
- 模板参数包:在模板参数列表中,用 ... 修饰 class 或 typename 则对应的模板参数是一个 包,即一个符号代表 N 个类型,如下代码 Types 就是模板参数包;
- 函数参数类型包:同样在函数参数类型列表中的类型后添加 ... 表示函数参数类型包,如下 const T& ... ;
- 函数参数包:函数传参时,参数名后有... 修饰表示函数参数包;
void print() {}template<class T, class... Types>
void print(const T &arg, const T& ... args) {cout << arg << std::endl;print(args...);
}int main(int argc, char* argv[]) {print(1, 56.8f, 'y', "hello");
}
二、参数包展开
- 递归展开
main 函数中用参数 1, 56.8f, 'y', "hello" 调用 print 函数会匹配到 template<class T, class... Types> void print(const T &arg, const T& ... args), 第一个实参1会传给 arg,剩余的参数传给args,然后递归调用函数模板print,这时参数包的第一(56.8f)又会传给 arg,剩余的参数传给args,这样逐步取第一个,直到取完为止。当参数包为空时需要调用一个无参的 print,所以重载一个 void print()。