0

我正在尝试用 C++ 编写简单的哈希表。我的哈希表实现模板如下所示:

template<class k, class v, class h<k>, class e<k> >
class my_hash {


};

其中
k = 键的类类型
v = 值的类类型
h = 散列 fn 的
类类型 e = 相等 fn 的类类型

我已经像这样定义了 h 类

template<class k>
class h {


};

我会专门针对不同的 k 类型的模板,例如 int、string 等。我想要做的是每当我用 k 调用 my_hash 模板时,它应该自动获取

h<k>

作为哈希函数类型。为此,我该如何定义模板?

如果我像上面显示的那样定义它,g++ 会给出编译器错误,说 h 不是模板?有人可以帮我吗?

4

2 回答 2

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;
  //...
};

现在您可以将类模板(接受一个类型参数)作为第三个和第四个模板参数传递给上述类模板。在您的书中或网上查找模板模板参数,了解更多。你可以从这里开始:

希望有帮助。

于 2013-04-04T04:42:09.317 回答
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);
}

看看 with key_hash_traits,所有相互关联的类型(key,hash func)是如何放在一起的,这很好,并且定义my_non_functioning_hash_table也更简单,因为它只需要引用 trait。这个例子确实假设每个键类型只有一个哈希函数,但你可以轻松地修改它。我希望你能得到大致的想法。

有关特征的更多阅读,请参阅以下链接:

于 2013-04-04T05:31:30.157 回答