函数模板不定参数,记忆中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)
这都是正确的定义,但因为递归好处理,我们多采用第一种方式。