可变参数模板可以创建任意个参数的模板函数和模板类,本文主要介绍可变参数模板函数。
1.1可变参数模板函数声明和定义
template<typename... Args> //Args是一个模板参数包
void Show(Args... args) //args是一个函数参数包
{
//函数功能
return;
}
由上面代码可知,Args是一个模板参数包,args是一个函数参数包,都表示一系列的参数。
可变参数模板函数一般用于可变参数输出,可变参数args的调用不能用args[2]方式调用,可以采用递归展开和非递归展开。下面示例给出了两种递归展开和非递归展开用法。
1.2可变参数模板函数调用示例
/*定义和声明一个多参数模板函数,递归方式展开*/
void Show1(){} //定义零个参数函数,递归调用到零个参数函数时。调用该函数,然后终止继续递归
template<typename T,typename ... Args> //Args是一个模板参数包
void Show1(const T &value,const Args &... args) //args是一个函数参数包
{
qDebug()<<"Show1 value=="<<value;
Show1(args...); //递归调用,依次展开每个参数。不能用args[2]方式调用,只能依次展开
}
/*定义和声明一个多参数模板函数,非递归方式展开*/
template<typename T>
void Print(T arg)
{
qDebug()<<"Show2 Print(arg)=="<<arg;
}
template<typename ... Args>
void Show2(Args ... args)
{
int a[]={(Print(args),0)...};
for(uint i=0;i<sizeof a;i++)
qDebug()<<QObject::tr("Show2 a[%1]==").arg(i)<<a[i];
}
/*调用按钮函数*/
void Widget::on_pushButton_2_clicked()
{
Show1(1,2.0,"33","string");
Show2(66,8888.0,"dsd","sd545sd2s");
}
![](https://img-blog.csdnimg.cn/20190717230352333.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25haWJvemh1YW4zNzQ0,size_16,color_FFFFFF,t_70)
1.3总结
由上面代码可知,模板函数Show1()为递归调用方式,模板函数Show2()为非递归调用方式。一般来说,递归调用方式安全可控,而非递归调用方式调用次数比较难以控制。
参考内容:
《C++ Primer Plus》(第6版)中文版 827-831页(参考:可变参数模板函数)
https://www.cnblogs.com/lsgxeva/p/7787500.html(参考:非递归展开方式)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)