如何动态创建状态机

How to dynamically create state machine

我还不知道如何使用 boost msm 动态创建 FSM,例如读取描述机器的模板 XML 文件。知道如何解决这个问题吗?我想在 boost msm 1.61 中使用仿函数方法。

我取得了一些进展,我可以用常用的方式为前端创建一个基础class:

class SMBase : public msmf::state_machine_def<SMBase>
{
 ...
};
using SMBaseBackend = msm::back::state_machine<SMBase>;

class SMDerived : public SMBase
{
 ...
};
using SMDerivedBackend = msm::back::state_machine<SMDerived>;


class SMDerived2 : public SMBase
{
 ...
};
using SMDerived2Backend = msm::back::state_machine<SMDerived2>;

但是,状态机本身由后端控制,到目前为止我看不出在运行时选择后者(例如使用

map<int, smart_pointer<SMBaseBackend> >

).

Boost.MSM 不支持动态创建状态机结构。 MSM 是 Meta State Machine,Meta 在此上下文中表示编译时间。所以所有的状态机结构都是在编译时构建的。您可以在以下文档中了解为什么 Boost.MSM 采用该方法: http://www.boost.org/doc/libs/1_61_0/libs/msm/doc/HTML/pr01.html

第二段"Another state machine library? What for?"描述了动态状态机结构创建的缺点。

您可能想知道替代方案。

Boost.Statechart 两者都不支持。以下文档描述了原因:

http://www.boost.org/doc/libs/1_61_0/libs/statechart/doc/rationale.html#DynamicConfigurability

根据文档,Boost.Statechart 支持非常有限的动态配置。文件说"However, this does not mean that it's impossible to dynamically shape a machine implemented with this library. For example, guards can be used to make different transitions depending on input only available at runtime."

但是,有一个支持动态创建状态机的状态机库。 Qt的QStateMachine就是它。参见 http://doc.qt.io/qt-5/statemachine-api.html

有一种解决方法,适用于不需要在运行时从许多状态机中进行选择的设置:

定义一个包含父状态机并在子机上实现其他状态机。然后在运行时级别上可以通过使用父状态机的转换 table 和调用相应的 process_event (respective_event()).

来“跳入”相应的子机

效果很好,现在只有 current_state 只是 returns 父级状态。