如何在C ++中处理不同的模板参数?

时间:2016-12-20 10:55:42

标签: c++ string templates hashtable

我需要在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没有定义的运算符%”。

所以,我的问题是:我怎么能这样做?

1 个答案:

答案 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; 
}