如何在C ++中检查对象的类型

时间:2013-03-13 21:18:23

标签: c++

在java中,有一个关键字“instanceof”,可用于确定对象的类型。在C ++中,我到目前为止找到的唯一解决方案是使用dynamic_cast。这种方法不仅不好,而且也非常昂贵。它之所以糟糕是因为控制流程是通过捕获异常来驱动的。在我看来,异常应仅用于“异常”情况,而不是用于控制主要代码流。

想象一个用例,网络处理程序可以接收不同类型的消息。这个处理程序可以有一长串try catch块,每个块都在尝试dynamic_cast。有可能对于每一条消息,都会引发许多异常,直到流程最终找到正确的类型。这也会杀死应用程序中的性能,因为捕获异常并不便宜。

你能否建议使用dynamic_cast的替代方法,类似于java的instanceof运算符,这样我可以避免异常捕获开销?

更新:RTTI之外的任何解决方案都会很棒,因为RTTI也很昂贵。也许,我可以在消息中放入字符串名称并将字符串映射到对象?

2 个答案:

答案 0 :(得分:5)

您正在寻找typeid运营商。返回type_info个对象,可以比较它们的相等性。或者,dynamic_cast指针,返回null而不是抛出异常。

答案 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类接口定义要由派生类实现的行为。