目录
概述
可变参函数模板
可变参类模板
概述
可变参模板是C++11引入的一个功能强大的特性。英文名是Variadic Templates。其允许我们定义参数数量可变的模板函数和模板类,更加的提高了编写的灵活性和通用性。在可变参数模板中,参数的数量在编译时才会确定。这种机制多用于元组操作、函数封装、递归模板等需要处理不确定参数数量的场景。
可变参函数模板
定义可变参数模板使用参数包: ... ,表示接受可变数量的参数,参数包可以分为类型参数包和非类型参数包两种。通常将此方法定义的参数叫做一包参数,代表零个到多个参数。
template<class... T>//类型模板参数,T叫做可变参类型
void Func(T... args)
{cout<<sizeof...(args)<<endl;//输出可变参数目
}Func(10,5,7,"abc");//可变参函数模板的调用template<int... a>//非类型模板参数
void Func2(a)
{int total=(...+a);//使用折叠表达式计算参数包中所有值的和cout<<"Sum="<<total<<endl;
}Func2(1,2,3,4,5,6,7,8,10);//可变参函数模板的调用
我们可以通过递归的方法展开参数包,将参数包中的参数一一分开。方便起见,我们定义可变参函数模板一般将模板参数设为一个参数和一个参数包,这样展开较为便捷。
template<class... T,class R>
void Func(R& a,const T&... b)
{cout<<a<<endl;Func(b...);
}void Func()//终止函数
{cout<<"递归终止函数"<<endl;
}
可变参类模板
和可变参函数模板一样,可变参类模板同样支持将一包参数作为模板参数。一包参数的参数个数范围亦为零个到多个。但展开方式与可变参函数模板不尽相同,相比之下较为复杂。
template<class... T> class A{};//递归继承方式参开参数包
template<class Firstone,class... Others>
class A<Firstone,Others...> : private A<Others...>
{
public:A() :a(0){cout<<a<<endl;}A(Firstone m,Others n) :a(m),A(n...){cout<<a<<endl;}Firstone a;
};
组合关系和继承关系都是面向对象编程的重要概念。组合关系即一个类包含另一个类对象。
//递归组合方式展开参数包
template<class Firstone,class... Others>
class A
{
public:A :a(0){cout<<a<<endl;}A(Firstone m,Others n) :a(m),ab(n...){cout<<a<<endl;}
public:
Firstone a;
A<Others...> ab;
};