可变参数模版是C++11新增的最强大的特性之一,它对参数进行了泛化,能支持任意个数、任意数据类型的参数。
语法:在模板中类型名前加...,在参数类型名后加...,递归传参时在变量名后加...
sizeof...(args)可以求还剩多少参数未展开
示例:
#include <iostream>
using namespace std;
template<typename T>
void show(T output)
{
cout<<output<<endl;
}
void print()// 递归终止时调用的非模板函数,函数名要与展开参数包的递归函数模板相同。
{
cout<<"print结束\n";
}
template<typename T,typename ...Args>
void print(T arg,Args... args)
{
cout<<"本次输出的参数:";
show(arg);
cout<<"还剩"<<sizeof...(args)<<"个参数\n";
print(args...);//递归调用,展开参数
}
template<typename ...Args>
void func(const string& str,Args... args)//还可以有非模板参数
{
cout<<str<<endl;
print(args...);
cout<<"func结束\n";
}
int main()
{
//print("测试",3,"个参数");
//print(4,"个参数也",1,"样");
func("此语句不是可变参数","这里开始","是可变参数");
return 0;
}