我有一棵树有以下要求
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都是自动生成的文件,我理想情况下不喜欢触及两者的源代码。
答案 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 */ }
到目前为止相当繁琐,但是在看不到整体画面的情况下无法分辨出最佳的设计细节,所以,希望你能得到这个想法。