我正在练习使用template
构建一个可以接受不同类型的哈希表。
如何在编译时实现hashFunction
不知道类型?
template<class K, class V>
class HashTable {
public:
vector<vector<Bucket<K, V> > > table;
...
size_t hashFunction(const K &k) {
//can't implement without knowing the runtime types
}
}
我猜我应该做类似的事情:
return hash<K>(k) % table.size();
更新
答案 0 :(得分:3)
如何在编译时实现
hashFunction
不知道类型?
您可以使用可用于为所有类型生成哈希值的通用逻辑。将组成k
的字节视为字符串中的字符。
此外,为用户提供提供自己的哈希函数的能力。
// Generic implementation
template <typename K> struct Hash
{
static size_t get(const K& k)
{
...
}
};
template<class K, class V, typename HashGenerator = Hash<K>>
class HashTable {
public:
vector<vector<Bucket<K, V> > > table;
...
size_t hashFunction(const K &k) {
HashGenerator::get(k);
}
}
struct Foo { ... };
// Specialize Hash for Foo.
template <> struct Hash<Foo>
{
static size_t get(const Foo& foo)
{
...
}
}