C++11 新特性详解
五、可变参数模版
1. 基本语法及原理
- C++11 支持可变参数模板,即支持可变数量参数的函数模板和类模板。可变数目的参数称为参数包,存在两种参数包:模板参数包(表示零或多个模板参数);函数参数包(表示零或多个函数参数)。
template void Func(Args... args) {}template void Func(Args&... args) {}template void Func(Args&&... args) {}- 使用省略号来指出一个模板参数或函数参数表示一个包。在模板参数列表中,
class...或typename...指出接下来的参数表示零或多个类型列表;在函数参数列表中,类型名后面跟...指出接下来表示零或多个形参对象列表。函数参数包可以用左值引用或右值引用表示,遵循引用折叠规则。 - 可变参数模板的原理与模板类似,本质是实例化对应类型和个数的多个函数。
- 可以使用
sizeof...运算符去计算参数包中参数的个数。
template <class ...Args> void Print(Args&&... args) {
cout << sizeof...(args) << endl;
}
int main() {
double x = 2.2;
Print(); // 包里有 0 个参数
Print(1); // 包里有 1 个参数
Print(1, string("xxxxx")); // 包里有 2 个参数
Print(1.1, string("xxxxx"), x); // 包里有 3 个参数
return 0;
}
原理说明:
- 编译本质结合引用折叠规则实例化出以下四个函数:
void Print()void Print(int&& arg1)void Print(int&& arg1, string&& arg2)




