dynamic_cast还是冗余

dynamic_cast or redundancy?

本文关键字:冗余 cast dynamic      更新时间:2023-10-16

在我的系统中,低层次对象通过调用+1级层次对象的函数与高层次对象对话,该函数调用+1级层级对象的函数等,直到函数调用在接收器处停止。

有一个Message抽象类,还有许多派生类,它们包含不同类型的数据。类似:

  • FruitMessage:字符串,int

  • 协调消息:浮动,浮动,浮动

我之前提到的那些方法需要Message对象,所以这个链调用是通过一种方法完成的,而不是为所有Message类型创建方法。

当接收者接收到Message对象时,问题就出现了。

接收者想知道该消息中有什么,这样它就可以根据消息类型的要求处理接收消息

(就像它在FruitMessages中将整数减少1,在CoordinateMessages中划分坐标等)

目前我有两个想法,但可能没有一个是正确的,我应该使用第三个。(请告诉我)

  • 接收到的dynamic_casting类型不正确。

  • Message有一个名为MessageType的枚举字段,该字段在派生类的构造函数中初始化为正确的值,因此接收方在该过程中只使用开关大小写。

我的问题是,裁员值得吗?

  • dynamic_cast比整数检查慢

  • 但每次创建新的Message类时,我都必须创建一个新的枚举值。

我该怎么办?

两种方式都可以。冗余与速度是软件开发中非常常见的问题。我会选择dynamic_cast,因为冗余是解决错误的第一步,但这实际上取决于您的性能要求。我在使用Akka时看到了非常类似的问题,他们通常使用dynamic_cast(我指的是java/scala类似物)

我建议使用typeid运算符来检查消息的类型。这样,就可以避免重复调用dynamic_cast,直到得到正确的类型。

void process_message(Message const& msg) {
if (typeid(msg) == typeid(FruitMessage)) {
auto& fruit_msg = static_cast<FruitMessage const&>(msg);
…
}
}

更好的是,您可以使用C++17std::any容器类型。any对象可以像非多态值一样四处复制,并且不需要使用虚拟基类。如果您没有访问C++17库实现的权限,则可以使用boost::any

void process_message(std::any const& msg) {
if (msg.type() == typeid(FruitMessage)) {
auto fruit_msg = std::any_cast<FruitMessage>(msg);
…
}
}

至于使用enum字段是否比typeidany更快,您必须自己进行基准测试。