【发布时间】:2016-06-24 01:45:02
【问题描述】:
我们正在考虑一种需要铸造但感觉不合适的设计。显然用谷歌搜索了这个问题,但没有找到答案。希望获得有关如何避免铸造需要的建议。这是一个精简的例子(请执行任何错别字,这还没有编译)。
struct NodeBase
{
enum class type
{
value,
aggregate
};
type m_type;
};
struct NodeAggregate : public NodeBase
{
std::vector<NodeBase*> m_list;
};
struct NodeValue : public NodeBase
{
std::string m_key;
std::string m_value;
};
上述类可用于创建具有多个级别的树结构。
“困难”是开发一种无需强制转换即可遍历此结构的算法。基类中的类型变量应识别正确的类型,并将强制转换的次数减少到单个,但不会避免强制转换。
这个问题的替代设计是什么?
欣赏任何 cmets。
【问题讨论】:
-
std::vector<NodeBase>- 如果您打算在该向量中存储NodeBase(例如NodeValue或NodeAggregate)的派生,请三思。那将是object slicing 的经典案例,我严重怀疑这是可取的。 -
你应该考虑用虚拟方法来实现你所需要的
-
您很可能正在搜索访问者模式。
-
@Roddy 没有 vtable,因为类型不是多态的。
-
@n.m.:愿意为这个相当大胆的声明提供任何理由吗?