可变参数模板:允许模板中有0个到任意个模板参数,在语法上和传统模板不一样,多了一个...
下面是简单的示例
template<typename... T>
void func1(T... a) // T:一包类型, a: 一包形参
{
cout << sizeof...(T) << endl;
cout << sizeof...(a) << endl;
}
func1(); // 打印0 0
func1(4); // 打印1 1
func1(4, 5); // 打印2 2
func1(4, 66.6, 'a', "sfds", 6); // 打印5 5
对于可变参数模板我们一般把a称作一包,或者一堆参数,并且这些参数可以完全不同,对于T不能把它看作为具体的类型,要理解为0到多个不同的类型,那么a就是多个不同的参数
参数包的展开:展开参数包,一般都采用递归函数, 所以在我们代码的编写过程中,需要有一个参数展开包的函数,和一个同名的递归终止函数, 可以通过这两个函数将参数包展开。一般对于可变参函数模板,都写一个参数,和一包参数,这样方便参数包的展开。
void func_2()
{
cout << "递归终止函数" << endl;
}
template<typename T1, typename... T2>
void func_2(const T1 & a, const T2&... b)
{
cout << "收到的参数为:" << a << endl;
func_2(b...);
}
func_2(3, "as", 45.5, 'a');
下面示例一种类模板的可变参数模板的写法
template<typename... T2>
class My_Func {};
template<typename T1, typename... T2>
class My_Func<T1,T2...> : private My_Func<T2...>
{
public:
My_Func()
{
printf("My_Func::My_Func执行力, this = %p\n", this);
}
};