dynamic_cast还是冗余
dynamic_cast or redundancy?
在我的系统中,低层次对象通过调用+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
字段是否比typeid
或any
更快,您必须自己进行基准测试。
- 如何擦除冗余输入?
- 使用提升几何缓冲区缩放多边形时的冗余折点
- 我应该担心冗余声明吗?
- Qt的slot(?)将冗余命名空间插入连接
- 方法冗余移动调用的移动语义
- 使用 llvm 和本地值编号算法擦除冗余表达式
- 优化堆上创建的冗余变量
- 如何消除访客模式冗余?
- 表达式模板需要冗余重载
- C++,处理多个构造函数重载和冗余代码
- 使用模板基类消除工厂类派生类冗余的干净方法
- 连接两个文件时如何避免冗余尾随换行符?
- CMake:修改共享库时的冗余链接
- 提升精神 X3:"属性没有预期的大小"冗余
- 如何简化此冗余C++代码?
- 是``if`语句''在modulo之前和分配操作之前的冗余
- 使用最终类说明符时,最终函数说明符是否冗余?
- 简化冗余std :: array初始化,当时没有constexpr构造函数
- 尝试使用 OpenMP 并行化递归函数的冗余计算
- Linux C LIBEV官方示例显示了冗余控制台行为