如何在具有多个参数类型的模板类中专门化一个方法

How to specialize ONLY one method inside a template class with many argument types

本文关键字:专门化 方法 一个 类型 参数      更新时间:2023-10-16

我正在用c++实现一个HashTable模板类,它的原型是这样的:

template<class K, class T, unsigned int containerSize=CONTAINER_SIZE>
class LPHashTableChained{
    ........
    unsigned int hashFunction(K& key);
}

我的问题是我如何专门化我的hashFunction()方法的行为不同,当K等于字符串类型

我试图以其正确的格式实现该函数,并在第二次实现中省略class K参数并将字符串作为类型,如下所示:

1日实现:

template<class K, class T, unsigned int containerSize>
unsigned int LPHashTableChained<K,T,containerSize>::hashFunction(K& key){
}

2日实现:

template<class T, unsigned int containerSize>
unsigned int LPHashTableChained<string,T,containerSize>::hashFunction(const string& key){
}

但是我得到编译错误!!

K= string指定hashFunction时,最简单的方法是什么?

谢谢

不能部分特化模板的成员函数。(完全专门化是可以的。)

对于您的类来说,最好的方法是按照标准库的做法,并将哈希函数作为"策略"类型的模板参数提供:
template <typename K, typename V, typename Hash = std::hash<K>>
class HashTable
{
  Hash hasher;
  // use hasher(x)
};

现在您可以简单地为您的字符串类型指定散列器,或者提供您自己的散列器:

// provide custom
struct MyInsaneHasher { std::size_t operator()(const Foo &) const; };
HashTable<Foo, int, MyInsaneHasher> m1;
// add specialization for `std::hash`:
namespace std
{
  template <> struct hash<Bar> { size_t operator()(const Bar&) const; };
}
HashTable<Bar, int> m2;