2013-04-04 76 views
0

我想在C++中编写简单的哈希表。我的散列表实施方案模板看起来是这样的: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种类型的以上模板,例如整型,字符串等我想要做的是,每当我调用其中k my_hash模板,它会自动拿起

h<k> 

的哈希函数type.For做到这一点我怎么定义模板?

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

+0

为什么不'类H,类e'? – mfontanini 2013-04-04 04:28:15

+0

我试过这样做。 my_hash构造函数将采用类h作为参数。但是,如果我没有在构造函数中指定h作为默认的散列函数,是否有可能? – cppdev 2013-04-04 04:36:03

回答

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

现在,你可以通过类模板(这需要一个类型参数)作为第三和第四个模板参数的以上类模板。在您的书籍或在线中查找模板模板参数,了解更多信息。你可以从这里开始:

希望有所帮助。

+0

谢谢纳瓦兹。你的意思是像my_hash ,e >?它不适合我。 – cppdev 2013-04-04 05:01:42

+0

@cppdev:号'h '不是模板模板参数的参数,因为'h '不是模板。 'h'是一个模板,所以你可以这样做:'my_hash '。请通过链接详细了解它。了解他们如何工作。不要只是猜测。 – Nawaz 2013-04-04 05:03:46

+0

最后,我得到它与以下签名工作。模板,class e = e1 > h和k有h1 和e1 的默认值,其中h1和e1是实际模板。我也会尝试给模板模板参数。感谢Nawaz! – cppdev 2013-04-04 05:37:01

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,所有相关类型(键,哈希FUNC)如何放在一起,这是很好的,和my_non_functioning_hash_table的定义也比较简单的它只需要提到特质。这个例子的确假设你只有每个键类型都有一个hash func,但你可以很容易地修改它。我希望你能得到大致的想法。

有关性状多看书,看到这些链接:

+0

谢谢徐。我一定会研究它。 – cppdev 2013-04-04 05:53:20