c++函数模板 不定参数

函数模板不定参数,记忆中c++ primer中的例子大概如下,用到包扩展:

//用于匹配递归结束
void func()
{	
}
template<typename T, typename... U> //这里的U可以是不同类型
void func(const T& first, const U& ... args)
{
	cout << first << endl;
	func(args...);//递归调用,最后一次args为空,调用特化func()结束
}

int main()
{	
	func(1, 3, 5, "hello world");
	return 0;
}

假如我们要实现参数不固定的加法,需要如下实现:

//这个模板进行实际加法运算
template<typename T>  
T tempSum(const T& t)
{
	static T sum;
	sum += t;
	return sum;
}
//这里保存计算结果
template<typename T>  
T saveValue(const T& t)
{
	static T temp = t; //这里必须用static的功能
	return temp;
}

void temAdd() {}   //递归结束条件
template<typename T,typename... U>
T temAdd(const T& first, const U&... args)
{
	T result = tempSum(first);   //思考为什么用另外的函数计算,而不是定义static变量在次数计算
	temAdd(args...);             //递归,(这也是为什么要把结果保存在另一个函数的原因)
	return saveValue(result);	 //思考这里为什么要用一个函数保存结果
}

int main()
{
	//cout << temAdd("a", "bc", "ed") << endl; //错误 char *不能用+运算符进行运算
	cout << temAdd(string("a"),string("bc"),string("ed")) << endl;
	cout << temAdd(1,3,5,7,9) << endl;

	return 0;
}

我们的函数模板定个如下:

template<typename T,typename... U>
T temAdd(const T& first, const U&... args)
{}

当然也可以如下:

template<ypename... U>
T temAdd( const U&... args)

这都是正确的定义,但因为递归好处理,我们多采用第一种方式。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值