C++ 如何在C++;
在java中,有一个关键字“instanceof”,可以用来确定对象的类型。在C++中,我至今发现的唯一解决方案是使用DyrimeSkyCask。这种方法不仅不好,而且非常昂贵。它不好的原因是因为控制流是由捕获异常驱动的。我认为异常应该只用于“异常”情况,而不是控制代码的主要流程 设想一个用例,其中网络处理程序可以接收不同类型的消息。这个处理程序可以有一个很长的try-catch块列表,每个块都在尝试动态_转换。对于每一条消息,都有可能引发许多异常,直到流最终找到正确的类型。这也会降低应用程序的性能,因为捕获异常并不便宜 您能否建议类似于java的instanceof操作符的动态_cast的替代方案,以避免异常捕获开销C++ 如何在C++;,c++,C++,在java中,有一个关键字“instanceof”,可以用来确定对象的类型。在C++中,我至今发现的唯一解决方案是使用DyrimeSkyCask。这种方法不仅不好,而且非常昂贵。它不好的原因是因为控制流是由捕获异常驱动的。我认为异常应该只用于“异常”情况,而不是控制代码的主要流程 设想一个用例,其中网络处理程序可以接收不同类型的消息。这个处理程序可以有一个很长的try-catch块列表,每个块都在尝试动态_转换。对于每一条消息,都有可能引发许多异常,直到流最终找到正确的类型。这也会降低应用程序的
更新:除了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的方式设计你的程序,问题就消失了。您的具体示例无论如何都不会使用它,因此这听起来像是一个纯粹的假设问题。