可变参数模板用两种方法使用省略号。 参数名称的左侧表示参数包,参数名称的右侧将参数包扩展为单独的名称。
可变参数模板类定义语法的基本示例:
template<typename... Arguments> class classname;
Arguments 是参数包。 类 classname 可以接受参数数目可变,例如:
template<typename... Arguments> class vtclass;
vtclass< > vtinstance1;
vtclass<int> vtinstance2;
vtclass<float, bool> vtinstance3;
vtclass<long, std::vector<int>, std::string> vtinstance4;
通过使用可变参数模板类定义,您还可以要求至少一个参数。例如:
template <typename First, typename... Rest> class classname;
可变参数模板函数语法的基本示例:
template <typename... Arguments> returntype functionname(Arguments... args);
variadic 模板函数语法还可能有其他形式,包括不限制于:
template <typename... Arguments> returntype functionname(Arguments&... args);
template <typename... Arguments> returntype functionname(Arguments&&... args);
template <typename... Arguments> returntype functionname(Arguments*... args);
还允许使用类似 const 的说明符:
template <typename... Arguments> returntype functionname(const Arguments&... args);
按照可变参数模板类的定义,您可以创建需要至少一个参数的函数:
template <typename First, typename... Rest> returntype functionname(const First& first, const Rest&... args);
可变模板使用 sizeof…() 运算符(与更早的 sizeof() 运算符不相关):
template<typename... Arguments>
void tfunc(const Arguments&... args)
{
const unsigned numargs = sizeof...(Arguments);
X xobj[numargs]; // array of some previously defined type X
helper_func(xobj, args...);
}
sizeof…()返回参数的数量。
示例:
#include <iostream>
using namespace std;
void print() {
cout << endl;
}
template <typename T> void print(const T& t) {
cout << t << endl;
}
template <typename First, typename... Rest> void print(const First& first, const Rest&... rest) {
cout << first << ", ";
print(rest...); // recursive call using pack expansion syntax
}
int main()
{
print(); // calls first overload, outputting only a newline
print(1); // calls second overload
// these call the third overload, the variadic template,
// which uses recursion as needed.
print(10, 20);
print(100, 200, 300);
print("first", 2, "third", 3.14159);
}
输出:
1
10, 20
100, 200, 300
first, 2, third, 3.14159