C++ 如何动态创建状态机

C++ 如何动态创建状态机,c++,dynamically-generated,boost-msm,C++,Dynamically Generated,Boost Msm,我还不知道如何使用boost msm动态创建FSM,例如读取描述机器的模板XML文件。你知道如何解决这个问题吗?我想在boost msm 1.61中使用函子方法 我已经取得了一些进展,因此我可以用常见的方法为前端创建基类: class SMBase : public msmf::state_machine_def<SMBase> { ... }; using SMBaseBackend = msm::back::state_machine<SMBase>; class

我还不知道如何使用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>;
class SMBase:public msmf::state\u machine\u def
{
...
};
使用SMBaseBackend=msm::back::state\u machine;
类:公共SMBase
{
...
};
使用smderivedbend=msm::back::state\u机器;
SMDerived2类:公共SMBase
{
...
};
使用SMDerived2Backend=msm::back::state_machine;
然而,状态机本身是由后端控制的,到目前为止,我看不到在运行时选择后者的方法(例如使用

map<int, smart_pointer<SMBaseBackend> >
map

).Boost.MSM不支持动态创建状态机结构。MSM是元状态机,在此上下文中,元表示编译时。因此,所有状态机结构都是在编译时构建的。您可以在以下文档中了解Boost.MSM采用这种方法的原因:

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

你可能想知道其他选择

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

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


但是,有一个支持动态状态机创建的状态机库。Qt的qstate机器就是它。请参见

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

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


工作非常好,现在只有当前状态才返回父级状态。

非常感谢您的回复——我担心msm可能不适合此任务。然而,QT不是一个选择(特别是在嵌入式系统方面,它的开销太大了)。基本上,在我的例子中,我可以降低使用某些预定义模板的灵活性(w.r.t动态创建)。因此,我可以创建一个抽象的基本状态机类并从中派生模板,例如使用一个简单的映射来处理它们。那应该很好。再次感谢,回答除外!是的,您可以使用Boost.MSM定义带有一些自定义点的预定义状态机。您可以将值传递给状态机,并且在处理事件期间,您可以动态地评估保护和操作中的值。它提供了一些灵活性。