c++ - 带有 Boost MSM 的分层状态机

标签 c++ boost-msm

这里有一个问题要问那些有 Boost MSM 经验的人。 我有一个用 Boost MSM 实现的非常大的状态机,今天我终于用完了 vector 限制 50(有太多事件进入我的状态机,这是无法避免的)。我已经创建了更高的 vector header (vector60、vector70 等),但我想将我的状态机作为一个整体进行压缩。

问题是,MSM 是否支持分层状态机。例如(如果我错了请纠正我),在分层状态机中,如果事件未在特定状态下处理,则该事件将转发到当前状态的父状态等等。

作为减小转换表大小的一部分,我希望创建一个父状态,其中将处理具有通用处理程序的事件,从而减小转换表的大小。

感谢任何建议/意见。

谢谢

最佳答案

是的,Boost.MSM 支持分层状态机。分层状态机称为“子机状态”。它是 UML 术语,Boost.MSM 也使用它。

这是一个子机状态的例子: http://redboltz.wikidot.com/sub-machine-state

从父状态机到子状态机的转换,可以使用入口点伪状态。参见 http://redboltz.wikidot.com/entry-point-pseudo-state

从子状态机到父状态机的转换,可以使用导出点伪状态。参见 http://redboltz.wikidot.com/exit-point-pseudo-state

事件从最内层状态到最外层状态进行评估。所以你可以在父状态机上编写公共(public)转换。这是一个实际的小例子: http://redboltz.wikidot.com/practical-sub-machine-example

所有示例均包含UML状态机图和完整代码。

关于c++ - 带有 Boost MSM 的分层状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215849/

相关文章:

c++ - Boost MSM 库给出错误

c++ - 为什么下面的代码只在 a = 1 时返回 true?

c++ - 如何在 C++ 中提取二维数组的列?

c++ - 如何使用 cout 打印 0x0a 而不是 0xa?

c++ - 如何动态创建状态机

c++ - Boost Statechart vs. 元状态机

c++ - 如何使用 Boost MSM 减少编译时间

c++ - 将 timeval 成员变量复制到整型变量

c++ - C++中的字符串比较

c++ - 如何退出分成多个文件的分层 SM 中的子机? (使用 boost::MSM)