1

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

我已经取得了一些进展,因此我可以用常见的方式为前端创建一个基类:

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> >

)。

4

2 回答 2

3

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

第二段“另一个状态机库?有什么用?” 描述了动态状态机结构创建的缺点。

您可能想知道替代方案。

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

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

根据文档,Boost.Statechart 支持非常有限的动态配置。该文件说:“但是,这并不意味着不可能动态地塑造使用该库实现的机器。例如,可以使用守卫来根据仅在运行时可用的输入进行不同的转换。”

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

于 2016-06-10T00:07:09.737 回答
0

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

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

效果很好,只有 current_state 现在才返回父级状态。

于 2016-06-22T13:38:38.067 回答