我正致力于哈希函数的实现,主要基于Carter和Wegman技巧。基于输入空间的大小,所使用的素数需要足够长以产生鲁棒的散列,例如,如果我想要uint32_t的哈希值,我将使用梅森素数2 ^ 61-1,因此我需要一个uint64_t;对于uint16_t我还需要uint64_t等。
到目前为止,我已将其实现为具有两种类型的模板,但由于我事先知道哪些类型与哪些类型相关,因此如果我可以将其实现为具有单一类型的模板将更方便。
到目前为止I have something like:
template<typename T1, typename T2>
class Hash_CW2: public Hash<T1>{
protected:
T2 seeds[2];
[...]
void init(unsigned B, T2 seed0, T2 seed1);
public:
Hash_CW2(unsigned B, T2 seed0, T2 seed1);
[...]
virtual unsigned element(T1 j);
};
我希望有类似的东西:
template<typename T1, typename T2=GET_TYPE(T1)>
class Hash_CW2: public Hash<T1>{
[...]
};
知道怎么做吗?有可能吗?
非常感谢!
答案 0 :(得分:6)
使用模板专业化可以执行以下操作:
template <typename T>
struct hash_type_for;
template <>
struct hash_type_for<uint16_t>
{ using type = uint64_t; };
template <>
struct hash_type_for<uint32_t>
{ using type = uint64_t; };
template <typename T>
using hash_type_for_t = typename hash_type_for<T>::type;
然后像这样使用它:
template<typename T1, typename T2 = hash_type_for_t<T1>>
class Hash_CW2: public Hash<T1>{
或者,如果您希望T2
仅从T1
计算,并且不希望用户能够更改它:
template<typename T1>
class Hash_CW2: public Hash<T1>{
using hash_type = hash_type_for_t<T1>;