C++11支持可变模板参数,一个函数可以传入任意多个参数,类似于C语言的printf函数。示例如下:
#include<iostream>
using namespace std;
void print() //递归出口
{}
template <typename T,typename... Types>
void print(const T& firstArg,const Types&... args)
{
cout << firstArg << endl;
print(args...); // 每次调用将多个参数分解为1+N个,用递归实现所有参数遍历
}
int main()
{
print(1, 2, 3, "xxx", bitset<16>(377), 99);
cout << "c++" << __cplusplus << endl; //输出C++版本
return 0;
}
可变模板参数实现功能时,需要使用递归方式,每次都是将参数分解为1+N个,每一层递归进去之后,形参少一个。
注意:一定要有递归出口
经过代码验证:将代码中无参print去掉后(无递归出口),会导致编译不通过
下面是另一段代码,用于计算多参数的哈希值
//哈希计算,只接收两个参数,seed用于存放计算结果,val为将要计算哈希的变量
template<typename T>
void hash_combine(size_t &seed,const T &val)
{
//注意:这里hash<T>,若T为自定义变量,需自行偏特化hash
seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
template<typename T>
void hash_val(size_t &seed, const T &val)
{
hash_combine(seed, val);
}
template<typename T, typename... Types>
void hash_val(size_t &seed,const T& val,const Types&... args)
{
hash_combine(seed, val);
hash_val(seed, args...);
}
template<typename... Types>
size_t hash_val(const Types&... args)
{
size_t seed = 0;
hash_val(seed, args...);
return seed;
}