如果我有下面的模板参数:减少模板策略杂波
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