为不同级别的树使用不同的C ++模板

时间:2014-08-05 09:37:42

标签: c++ oop templates tree

我有一棵树有以下要求

T
|_T
| |_T
|   |_Y
|
|_T
  |_T
    |_Y

这里T和Y是两种不同的模板类型。我需要使用模板,因为我需要在所有节点上支持其他更通用的操作。

有人可以帮助我。

截至目前,我的树节点看起来像这样

template <typename T> class HierarchicalItem {
private:
    int32_t id;
    shared_ptr<T> data;
    shared_ptr<FlatList<HierarchicalItem<T> > > children;
}

但以上只能支持单一模板类型。

这里,T是带有getter和setter的简单值对象。这同样适用于Y.但是T和Y彼此不同并且不相关。通常,T和Y都将从输入流中读取并填充在树中。

T和Y都有==,=,&lt;&lt;,!=,&lt;运算符重载并定义no-arg构造函数。

叶子节点也只需要不同的Y型,但我觉得如果可能的话,设计应该适应任意数量的不同类型。

另外一条信息,T和Y都是自动生成的文件,我理想情况下不喜欢触及两者的源代码。

1 个答案:

答案 0 :(得分:1)

从公共基类继承两个模板。既然你已经有了一个基于指针的树,我推断你不会使用仅编译时的解决方案,在这种情况下,使用动态强制转换的继承就足够了。

这样的事情可行:

class TreeNodeBase {
protected: // or public?
    int32_t id;
    FlatList<TreeNodeBase> children;
}

template <typename T>
class HierarchicalItem : public TreeNodeBase { // or protected?
    shared_ptr<T> data;
}

要回读数据,请转发该项:

...
TreeNodeBase n = children.First(); // for example
HierarchicalItem<SomePayloadType> p = dynamic_cast<HierarchicalItem<SomePayloadType> >(n);

if (!p) { /* handle wrong payload type */ } else { /* use p.data */ }

到目前为止相当繁琐,但是在看不到整体画面的情况下无法分辨出最佳的设计细节,所以,希望你能得到这个想法。