c++ - 通过事件和状态重用 boost msm 问题

标签 c++ boost boost-msm

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

我有一个状态机 (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/

相关文章:

c++ - boost 状态图 : Return to Previous State

c++ - 在 boost::msm 中的子 SM 之间跳转

c++ - 从子状态机延迟事件

c++ - 将多个 MSM 状态机耦合在一起

c++ - c++最值得 "standard"的数据库库是什么?

c++ - 关于继承和引用的C++问题

c++ - Rcpp 如何检查 vector/矩阵边界?

boost - libboost1.74-dev 未安装在 Ubuntu 16.04 上

c++ - Boost 二进制文件读取错误 unsupported version

c++ - 为什么用 clang 编译时 std::atomic<double> 没有实现?