我需要在C ++中使用HashTable类,所以我决定创建一个模板类:
template <typename key_t, typename value_t>
class HashTable {};
在这种情况下,我需要哈希不同类型的键。 我尝试过类似的东西:
if(typeid(std::string) == typeid(_key)) {
return StrSum(_key) % TABLE_SIZE;
} else {
return _key % TABLE_SIZE;
}
但是如果typeid()不是编译时定义函数,我的编译器(MSVS)会给我一个错误“... std :: string没有定义的运算符%”。
所以,我的问题是:我怎么能这样做?
答案 0 :(得分:2)
您可以使用重载:
void hash_impl(const std::string& x)
{
return StrSum(x) % TABLE_SIZE;
}
template <typename T>
void hash_impl(const T& x)
{
return x % TABLE_SIZE;
}
您的if
... else
可以通过拨打hash_impl(_key)
进行替换。
或者,您可以在C ++ 17中使用if constexpr(...)
:
if constexpr(std::is_same<std::decay_t<decltype(_key)>, std::string>{})
{
return StrSum(_key) % TABLE_SIZE;
}
else
{
return _key % TABLE_SIZE;
}