可变参数模板
基本语法及原理
- C++11 支持可变参数模板,即支持可变数量参数的函数模板和类模板。可变数目的参数被作为参数包,存在两种参数包:模板参数包(表示零或多个模板参数);函数参数包(表示零或多个函数参数)。
- 格式:
- 注意模板是
class ...Args,参数类型是Args... template<class ...Args> void Func(Args... args) {}template<class ...Args> void Func(Args&... args) {}template<class ...Args> void Func(Args&&... args) {}
- 注意模板是
- 用省略号来指出一个模板参数或函数参数表示一个包。在模板参数列表中,
class...或typedef...指出接下来的参数表示零或多个类型列表;在函数参数列表中,类型名后面跟...指出接下来表示零或多个形参对象列表;函数参数包可以用左值引用或右值引用表示。每个参数实例化时遵循折叠规则。 - 用
sizeof...运算符计算参数包中参数的个数(不是sizeof,这是一个新的运算符)。
template <class ...Args> void Print(Args&&... args) //0-N 个参数 { cout << sizeof...(args) << endl; }
int main() {
double x = 2.2;
Print(); // 包里有 0 个参数
Print(1); // 包里有 1 个参数
Print(1, string("xxx")); // 包里有 2 个参数
Print(1, string("xxx"), x); // 包里有 3 个参数
return 0;
}
// 原理 1:编译本质这里会结合引用折叠规则实例化出以下 4 个函数 // void Print(); // void Print(int&& arg1); // void Print(int&& arg1, string&& arg2); // void Print(double&& arg1, string&& arg2, double& arg3); //x 是左值,所以 double& // 原理 2:更本质去看有没有可变参数模板,我们是先出这样的多个函数模板才能支持这里的功能,有了可变参数模板,我们进一步被解放,他是类型泛化基础上叠加数量变化,让我们泛型编程更灵活 // template void Print(T1&& arg1); // template <class T1, class T2> void Print(T1&& arg1, T2&& arg2); // template <class T1, class T2, class T3> void Print(T1&& arg1, T2&& arg2, T3&& arg3);



