最近在封装打印函数,需要支持不同参数个数和类型,用了函数重载感觉有点麻烦且不太能满足所有的条件。研究了一下C++11的新特性可变模板参数
模板定义:声明可变参数模板时需要在typename或class后面带上省略号“…”。
template <class… T>
**可变模版参数函数:**可变模版参数传进来的是一个参数包,我们需要将参数包展开。
由于包里面的参数个数是不确定的,可以使用递归的方法展开。
这里注意我们还要准备一个递归终止函数,参数包Args…在展开的过程中递归调用自己,每调用一次参数包中的参数就会少一个,直到所有的参数都展开为止,当没有参数时,则调用非模板函数终止递归过程。
递归终止函数
void PrintStd()
{ std::cout <<"递归终止" << endl;
}展开函数
template<typename Type, typename ...Args>
/*** @param const Type currentArg 本次展开拿到的参数* @param const Args... args 参数包中剩余的参数*/
void PrintStd(const Type currentArg, const Args... args)
{std::cout << currentArg << endl;PrintStd(args...);
}
//调用测试
int main()
{PrintStd("hello", "world",100);return 0;
}
结果输出:
可变模版参数求和
template<typename T>
int getSum(T t)
{ return t;
}
template<typename Type, typename ...Args>
int getSum(const Type currentArg, const Args... args)
{return currentArg + getSum(args...);
}int main()
{int ret=getSum(1,2,3,4,5);std::cout << "ret=" << ret << endl;return 0;
}
结果输出:ret=15