可变参数模版

 

//模版头
template < typename ... Args> //Args 是模版参数包
void print( Args ... args)           //args 是函数参数包
{
    print(args...)   //展开函数参数包    
}
/*
    以上是一个可变参数模版的基本写法;
    有3个点在 Args与 args 前; 意味这是一个包;
    可以理解为 :
    ...在参数前是  聚合参数
    ...在参数后是  展开参数
*/

如有一下调用:
print("123",123,4.5); 
相当于生成一个 : print(const char*, int,double) 函数实例;

通常可变参数模版是用来递归的.但上面的函数将导致无穷递归;
下面是解决办法;

//main.cpp

//新增的一个模版,用于最后一次打印
template <typename T>
void print(const T& t)
{
    cout << t << endl;
}

//原来的模版,修改版 
template <typename T , typename ... Args>
//类型前加了const , 以及引用 ; 额外增加了第一个参数t
void print(const T& t, const Args& ... args) 
{
    cout << t << ' ';
    print(args...);
}

//如果有如此调用
print(1,'a',4.5,"nihao");
那么, 'a',4.5,"nihao"3个参数将被聚合.
即第一次调用将输出  1 ; 
函数原型: 
print(const int&,const char&,const double&,const char*&);

第2次调用将输出 'a';
函数原型:
print(const char&,const double&,const char*&);

每一次从函数参数包中取出一个, 按以上推导,最后一次将调用新增的函数模版;





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值