C++ 如何在C++;

C++ 如何在C++;,c++,C++,在java中,有一个关键字“instanceof”,可以用来确定对象的类型。在C++中,我至今发现的唯一解决方案是使用DyrimeSkyCask。这种方法不仅不好,而且非常昂贵。它不好的原因是因为控制流是由捕获异常驱动的。我认为异常应该只用于“异常”情况,而不是控制代码的主要流程 设想一个用例,其中网络处理程序可以接收不同类型的消息。这个处理程序可以有一个很长的try-catch块列表,每个块都在尝试动态_转换。对于每一条消息,都有可能引发许多异常,直到流最终找到正确的类型。这也会降低应用程序的

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

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

您能否建议类似于java的instanceof操作符的动态_cast的替代方案,以避免异常捕获开销


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

您正在寻找运算符。它返回对象,可以比较这些对象是否相等。或者,
dynamic\u cast
指针,返回null而不是抛出异常。

您正在寻找运算符。它返回对象,可以比较这些对象是否相等。或者,
dynamic\u cast
指针,它返回null而不是抛出异常。

如果您正在通过网络序列化对象,我假设您有某种工厂可以从网络中重新创建它们

工厂有一个switch语句、一个map或其他允许您创建正确对象的东西。它不使用运行时类型信息

您创建的对象将具有一些公共基础。从那里创建您的层次结构。如果层次结构中的所有对象没有预期的常见行为,请使用
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
模式最合适。如果你有一个不稳定的层次结构,但有一组稳定的行为,你可以做正常的事情,让
基本
类接口定义由派生类实现的行为。

如果你在网络上序列化对象,我假设你有某种工厂可以从网络上重新创建它们

工厂有一个switch语句、一个map或其他允许您创建正确对象的东西。它不使用运行时类型信息

您创建的对象将具有一些公共基础。从那里创建您的层次结构。如果层次结构中的所有对象没有预期的常见行为,请使用
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
类接口定义要由派生类实现的行为。

Google RTTI,但它不像Java或Objective-C那样灵活,也不像Java或Objective-C那样自反?诚然,很多人都这么说,但他们大多是错的。“RTTI很贵”就像测量每行代码的时钟周期一样荒谬。@Jimm比什么贵?如果你以一种不需要RTTI的方式设计你的程序,问题就消失了。您的特定示例无论如何都不会使用它,因此这听起来像是一个纯粹的假设问题。Google RTTI,但它没有Java或Objective-C的灵活或反射性。您测量过RTTI并确定它太贵了吗?诚然,很多人都这么说,但他们大多是错的。“RTTI很贵”就像测量每行代码的时钟周期一样荒谬。@Jimm比什么贵?如果你以一种不需要RTTI的方式设计你的程序,问题就消失了。您的具体示例无论如何都不会使用它,因此这听起来像是一个纯粹的假设问题。