前言
可变参数模板是C++11中的新特性,它能够让我们创建可以接收可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数是一个巨大的改进,通过系统系统推演数据的类型,不用自己写出模板参数类型。
下面我们来创建一个基本的的能够接收可变参数的函数模板:
template<class ...Args>
void ShowFunc(Args... args)
{
}
声明一个参数包Args... args,这个参数包中可以包含0到任意个模板参数。
上面代码中Args是一个模板参数包,args是一个函数形参参数包。
#include<iostream>
#include<string>
using namespace std;
template<class ...Args>
void ShowFunc(Args... args)
{
cout << sizeof...(args) << endl;
}
int main()
{
ShowFunc(1);
ShowFunc(1, 1.1);
ShowFunc(1, 1.1, 'A', std::string("sort"));
return 0;
}
sizeof...(args)是计算该函数中含有多少个参数,即计算函数形参的个数。
下面我们来看一下如何使用可变参数的函数模板获取其参数包的值。
方法一:编译器编译时的递归推演:第一个模板参数依次解析获取参数包中的参数值。
#include<iostream>
#include<string>
using namespace std;
// 递归终止函数
template <class T>
void ShowFunc(const T& t)
{
cout << t << endl;
}
// 展开函数
template <class T, class ...Args>
void ShowFunc(T value, Args... args)
{
cout << value << " ";
ShowFunc(args...);
}
int main()
{
ShowFunc(1);
ShowFunc(1, 1.1);
ShowFunc(1, 1.1, 'A', std::string("sort"));
return 0;
}
方法二:利用逗号表达式展开参数包:初始化数组arr,强行让编译器解析参数包,参数包有几个参数,PrintArg就自动推演生成相应个。
#include<iostream>
#include<string>
using namespace std;
template <class T>
void PrintArg(T t)
{
cout << t << " ";
}
//展开函数
template <class ...Args>
void ShowFunc(Args... args)
{
int arr[] = { (PrintArg(args), 0)... };
cout << endl;
}
int main()
{
ShowFunc(1);
ShowFunc(1, 'A');
ShowFunc(1, 'A', std::string("CSDN"));
return 0;
}