本文以函数模板为例进行说明,类模板可以添加相应方法实现。
含有可变模板参数的函数模板如下所示。
template <typename... Args>
void Func(Args&&... args)
{
}
我们知道可变参数的类型是由编译器根据传入函数的实参推导出来的,若我们需要获取可变参数的类型,可以使用如下函数模板。
template <typename... Args>
void PrintArgs(const char *desc, Args&&... args)
{
int argn = sizeof...(Args);
const char *argc[] = { typeid(Args).name()... };
cout << desc << " [ size : " << argn << " ] ";
for (int i = 0; i < argn; i++)
{
cout << " [ " << argc[i] << " ] ";
}
cout << endl;
}
参数desc为描述信息,args为可变模板参数,可以配合完美转发来保留传入参数的左值引用和右值引用特性。可以用下面代码来使用此函数。
PrintArgs("Template Function Args", std::forward<Args>(args)...);
调用Func函数
Func(5, "Hello World");
打印结果
Template Function Args [ size : 2 ] [ int ] [ char const [12] ]