C++11可变模板参数

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值