2013-04-04 70 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