c ++模板相互依赖的类型

时间:2013-04-04 04:24:53

标签: c++ templates

我正在尝试用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不是模板?有人可以帮帮我吗?

2 个答案:

答案 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的定义也更简单,因为它只需要引用特征。此示例假设您每个键类型只有一个哈希函数,但您可以轻松修改它。我希望你能得到一般的想法。

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