【问题标题】:Boost msm problems with events and state reuse使用事件和状态重用来提升 msm 问题
【发布时间】:2012-07-10 20:37:26
【问题描述】:

我的转换表和事件有问题。 让我解释一下说明问题的假设计:

我有一个状态机 (myStateMachine),其中包含 2 个状态(s0 和 s1)和 1 个子状态机(subm1)。

子状态机 subm1 包含初始状态“sub0”和 s1(与 myStateMachine 中的状态相同)。

这是主要的转换表:

s0->事件'ES1'上的s1

s0->s2 事件“ES2”

s0->事件'ESUB'上的subm1

这是冲锋转换表:

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,但那时我没有访问它。

我希望这很清楚。

【问题讨论】:

    标签: c++ boost boost-msm


    【解决方案1】:

    我收到了来自 BOOST MSM 设计师 Christophe Henry 的答复:

    “你好,

    这是我对 msm(用于复合)的一个不幸限制 我要尽快解决的问题清单。问题是虽然事件 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& ) 
       {    } 
       }; 
    

    "

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多