我正在尝试用c ++编写简单的哈希表。我的哈希表实现模板如下所示:
template<class k, class v, class h<k>, class e<k> >
class my_hash {
};
其中
k =键的类类型
v =值的类类型
h =哈希fn的类类型
e =等式的类类型fn
我已经定义了类似这样的课程
template<class k>
class h {
};
我会专门针对不同的k类型的模板,例如int,string等。我想做的是每当我用k调用my_hash模板时,它应该自动拿起
h<k>
作为哈希函数类型。为此我将如何定义模板?
如果我像上面所示那样定义它,g ++会给编译器错误,说h不是模板?有人可以帮帮我吗?
答案 0 :(得分:2)
我认为您需要的是模板模板参数,它是:
template<class k, class v, template<typename> class h, template<typename> class e>
class my_hash
{
//then here you can intantiate the template template parameter as
h<k> hobj;
e<k> eobj;
//...
};
现在,您可以将类模板(采用一个类型参数)作为第三个和第四个模板参数传递给上面的类模板。在您的书中或在线查找模板模板参数,了解更多相关信息。你可以从这里开始:
希望有所帮助。
答案 1 :(得分:0)
你当然可以使用模板模板参数,但你的预期用例 - 模板类型密切相关 - 是一个常见的用例,用特征解决了特征。
使用散列键,通常键类型与散列函数和相等函数密切相关。有了特征,你可以做一些像这个愚蠢的例子:
template <class T> struct key_hash_traits;
template <>
struct key_hash_traits<int>
{
typedef int key_type;
static size_t hash(int k) { return k*k / 42; }
};
template <class T, class V>
struct my_non_functioning_hash_table
{
void insert(T::key_type t, V v)
{
if (T::hash(t) == 13)
{
std::cout << "hello world\n";
}
}
};
int main()
{
int k = 256;
my_non_functioning_hash_table<key_hash_traits<int>, float> h;
h.insert(k, 3.14);
}
查看如何使用key_hash_traits
,所有相互关联的类型(键,散列函数)放在一起,这很好,my_non_functioning_hash_table
的定义也更简单,因为它只需要引用特征。此示例假设您每个键类型只有一个哈希函数,但您可以轻松修改它。我希望你能得到一般的想法。
有关特征的更多阅读,请参阅以下链接: