一个可变参数模板就是一个接受可变数目参数的模板函数或模板类。可变数目的参数被称为参数包(parameter packet)。存在两种参数包:模板参数包(template parameter packet),表示零个或多个模板参数;函数参数包(function parameter packet),表示零个或多个函数参数。
我们使用一个省略号来指出一个模板参数或函数参数表示的是一个参数包。
在一个模板参数列表中,class…或typename…指出接下来的参数表示零个或多个类型的列表;一个类型名后面跟一个省略号表示零个或多个给定类型的非类型参数的列表。在函数参数列表中,如果一个参数的类型是一个模板参数包,则此参数也是一个函数参数包。
sizeof…运算符
当我们需要知道包中有多少 元素时,可以使用sizeof…运算符。类似sizeof,sizeof…也返回一个常量表达式,而且不会对其实参求值:
template <typename ... Args>
void g(Args ... args)
{
// 类型参数的数目
cout << sizeof...(Args) << endl;
// 函数参数的数目
cout << sizeof...(args) << endl;
}