2012-07-10 40 views
0

我的轉換表和事件有問題。 讓我解釋說明問題的假設計:提升事件和狀態重用的msm問題

我有一個包含2個狀態(s0和s1)和1個子狀態機(subm1)的狀態機(myStateMachine)。

substatemachine 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,但我不能在此時訪問它。

我希望這很清楚。

回答

1

我收到的答案從BOOST MSM克里斯托夫·亨利設計師:

「嗨,

這是MSM的一個不幸的限制(複合材料),我有 我的東西名單解決儘快。問題是,雖然事件esub是 不是用來過渡到S1,編譯器就可以。不管結果如何,這是我的 故障,再加上我忘了在doc :(

的解決方案是通過使用來啓用on_entry來幫助編譯器evt.getEventData()僅適用於具有特殊屬性的事件,如es1。 例如:

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&) 
    { } 
    }; 

BOOST_MPL_HAS_XXX_TRAIT_DEF(get_event_data) 

// this event supports getEventData 
struct es1 
{ 
    typedef int get_event_data; 
    void getEventData(){...} 
}; 

然後在你的狀態下使用