1

假设我有以下代码:

template<typename K, typename V>
    int Hash<K, V>::hf(const K& key)
    {
        if(K == typeid(string))
        {
            return MurmurHash2(key.c_str(), key.size());
        }
        else
        {
            return key*2654435761;
        }

}

有可能以某种方式做到这一点吗?如果没有,你能推荐一种方法来完成同样的事情吗?

4

2 回答 2

0

您可以使用(部分)模板专业化:

// general case
template <typename K, typename V>
    int Hash<K, V>::hf(const K& key)
    {
        return key*2654435761;
    }

// string case
template <typename V>
    int Hash<std::string, V>::hf(const std::string& key)
    {
        return MurmurHash2(key.c_str(), key.size());
    }
于 2016-03-30T21:40:27.207 回答
0

这里有两种方法:

1) 模板特化(为模板参数做一个特例(这里:)std::string

template<typename K, typename V>
int Hash(const K& key)
{
    return key * 2654435761;
}

template<typename V>
int Hash(const std::string& key)
{
    return MurmurHash2(key.c_str(), key.size());
}

2)typeid用于比较类型

template<typename K, typename V>
int Hash(const K& key)
{
    if (typeid(K).hash_code() == typeid(std::string).hash_code())
        return MurmurHash2(key.c_str(), key.size());
    return key * 2654435761;
}
于 2016-03-30T22:27:09.730 回答