在java中,有一个关键字“instanceof”,可用于确定对象的类型。在C ++中,我到目前为止找到的唯一解决方案是使用dynamic_cast。这种方法不仅不好,而且也非常昂贵。它之所以糟糕是因为控制流程是通过捕获异常来驱动的。在我看来,异常应仅用于“异常”情况,而不是用于控制主要代码流。
想象一个用例,网络处理程序可以接收不同类型的消息。这个处理程序可以有一长串try catch块,每个块都在尝试dynamic_cast。有可能对于每一条消息,都会引发许多异常,直到流程最终找到正确的类型。这也会杀死应用程序中的性能,因为捕获异常并不便宜。
你能否建议使用dynamic_cast的替代方法,类似于java的instanceof运算符,这样我可以避免异常捕获开销?
更新:RTTI之外的任何解决方案都会很棒,因为RTTI也很昂贵。也许,我可以在消息中放入字符串名称并将字符串映射到对象?
答案 0 :(得分:5)
答案 1 :(得分:0)
如果您是通过网络序列化对象,我假设您有某种工厂可以从网络中重新创建它们。
工厂有一个switch语句,或者一个允许你创建正确对象的地图。它不使用运行时类型信息。
您创建的对象将具有一些共同基础。从那里创建您的层次结构。如果层次结构中的所有对象都没有预期的某些常见行为,请使用Visitor
模式动态添加行为:
struct Derived;
struct Visitor {
virtual void visit(Derived& derived) = 0;
};
struct Base {
virtual void accept(Visitor& visitor) = 0;
};
struct Derived : Base {
virtual void accept(Visitor& visitor) {
visitor.visit(*this);
}
};
Visitor
模式最适合您拥有相对稳定的层次结构,并且需要一组可更改的行为。如果您有一个不稳定的层次结构但是有一组稳定的行为,您可以执行正常操作,并使Base
类接口定义要由派生类实现的行为。