如果我有下面的模板參數:減少模板策略雜波
template <typename T_Key, typename T_Value, typename T_HashFunc,
typename T_ExtractKey, typename T_EqualKey, typename T_RehashClass, typename T_HashcodeClass>
class Hashtable { /* ... */ };
凡T_RehashClass
和T_HashcodeClass
是採取T_Key, T_Value, T_HashFunc, T_ExtractKey and T_EqualKey
以及兩個模板類。我希望這些類可以從Hashtable
的typedef列表中獲取類型(Hashtable
中的所有模板參數類型均爲類型定義)。
請注意,T_RehashClass
和T_HashcodeClass
也可以由用戶創建(默認提供),如果用戶希望可以有其他模板參數。
現在,任何類T_RehashClass
必須有T_Key, T_Value
等模板參數填寫,我認爲這是代碼重複。我希望該課程知道Hashtable
,以便它可以通過創建自己的typedef自動訪問其typedefs並自動推斷T_Key, T_Value
等。不幸的是,在這種情況下,我得到了循環依賴。
這類問題一般如何解決?
另請注意,我遵循的是EASTL,EASTL使用多重繼承來繼承T_RehashClass
和T_HashnodeClass
,因此Hashtable
擁有更多的模板參數。我想知道是否有解決方法(即不從策略繼承並將它們作爲從策略繼承的模板參數降低靈活性)。我認爲的
一個解決辦法是讓具有所有模板參數從T_Key
到T_EqualKey
模板結構。然後,Hashtable
聲明將是:
template <typename T_HashtableParams, typename T_RehashClass = default_rehash_class<T_HashtableParams>, typename T_HashcodeClass = default_hashnode_class<T_HashtableParams> >
class Hashtable { /* ... */ };
的T_RehashClass
和T_HashcodeClass
可以再取這將消除代碼重複的默認值。這種方法的問題是用戶使用起來更麻煩。
我很好奇你爲什麼需要這麼多的靈活性,允許用戶指定表會變得如何改頭換面......這真的好像YAGNI應該在踢 - 你想解決什麼問題需要這麼多的定製? – Yuushi 2012-01-13 03:47:02
'T_ExtractKey'和'T_EqualKey'是多餘的(你可以提取關鍵的平等的測試,沒有必要爲一個獨立的仿函數的一部分),以及'T_HashFunc'和'T_HashcodeClass'似乎也。 – 2012-01-13 03:48:40
@CatPlusPlus:那麼,在這個實現,但它有節點存儲hashkey與否的選項。 'T_HashcodeClass'有兩個不同的實現,一個假設hashkey存儲,另一個不存在。至於其他人,我也不完全確定,但EASTL擁有它。現在我知道這是不是包括它的理由,但我想筆者知道的比我多,我最終會明白(以下簡稱「最終understand'部分做了其他容器發生在我身上,而下面EASTL) – Samaursa 2012-01-13 03:55:21