我的转换表和事件有问题。 让我解释一下说明问题的假设计:
我有一个状态机 (myStateMachine),其中包含 2 个状态(s0 和 s1)和 1 个子状态机 (subm1)。
子状态机 subm1 包含初始状态“sub0”和 s1(与 myStateMachine 中的状态相同)。
这是主要的转换表:
s0->s1 在事件 'ES1' 上
s0->s2 在事件“ES2”上
s0->subm1 在事件 'ESUB' 上
这是子机转换表:
sub0->s1 在事件 'ES1' 上
现在,假设状态 s1 正在使用触发它的事件来提取一些信息,即
struct s1 : public msm::front::state<>
{
template <class Event,class FSM>
void on_entry(Event const& evt,FSM& fsm)
{
evt.getEventData();
}
}
所以每个可以转换到 s1 的事件都需要实现 getEventData() 方法。
->这是正常的!
现在我的问题是 ESUB 没有实现 getEventData() 但显然它应该(编译器给出错误)。我不明白为什么。
我没有使用 ESUB 过渡到 s1,但我正在使用 ESUB 过渡到 subm1,而 subm1 包含 s1,但此时我没有访问它。
我希望这是清楚的。
最佳答案
我收到了来自 BOOST MSM Christophe Henry 设计师的答复:
“你好,
这是 msm(对于复合 Material )的一个不幸的限制,我在 我要尽快解决的问题 list 。问题是虽然事件 esub 是 不用于过渡到 s1,对于编译器它可以。无论如何,这是我的 错误,而且我在文档中忘记了它:(
解决方案是通过启用 on_entry 来帮助编译器 evt.getEventData() 仅适用于具有特殊属性的事件,例如您的 es1。 例如:
BOOST_MPL_HAS_XXX_TRAIT_DEF(get_event_data)
// this event supports getEventData
struct es1
{
typedef int get_event_data;
void getEventData(){...}
};
然后在你的状态下使用它:
struct s1 : public msm::front::state<>
{
template <class Event,class FSM>
typename boost::enable_if<typename
has_get_event_data<Event>::type,void>::type
on_entry(Event const& evt,FSM& fsm)
{
evt.getEventData();
}
// for events not supporting getEventData like esub
template <class Event,class FSM>
typename boost::disable_if<typename
has_get_event_data<Event>::type,void>::type
on_entry(Event const& ,FSM& )
{ }
};
”
关于c++ - 通过事件和状态重用 boost msm 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11421537/