dynamic_cast还是冗余?

时间:2017-01-06 21:48:17

标签: c++ casting redundancy

在我的系统中,低层对象通过调用+1级层次结构对象的函数与高层对象进行对话,该对象调用+1级层次结构对象的函数等等,直到函数调用停止在配方上

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

  • FruitMessage:string,int

  • CoordinateMessage:float,float,float

等等

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

当recipent收到Message对象时,问题就来了。

配方想要知道该消息中的内容,因此它可以处理接收消息,因为消息类型需要

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

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

  • 当食谱没有正确的类型时,食谱会动态播放它。

  • 消息有一个名为MessageType的枚举字段,它在派生类中被初始化'构造函数为正确的值,因此配方在此过程中只使用了一个switch-case。

我的问题是值得裁员吗?

  • dynamic_cast比整数检查

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

我该怎么办?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

更好的是,您可以使用C ++ 17 std::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更快,您必须自己进行基准测试。