0

在java中,有一个关键字“instanceof”,可以用来判断对象的类型。在 C++ 中,到目前为止我发现的唯一解决方案是使用 dynamic_cast。这种方法不仅不好,而且非常昂贵。它不好的原因是控制流是由捕获异常驱动的。在我看来,异常应该只用于“异常”情况,而不是控制代码的主要流程。

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

您能否建议 dynamic_cast 的替代方案,类似于 java 的 instanceof 运算符,以便我可以避免异常捕获开销?

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

4

2 回答 2

5

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

于 2013-03-13T21:21:28.793 回答
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类接口定义派生类要实现的行为。

于 2013-03-13T21:54:04.950 回答