2

ブースト MSM フレームワークを使用してステート マシンを開発しています。彼らのチュートリアルでは、現在の状態がソース状態である場合、boost::anyを「Kleene イベント」として使用して、発生したイベントの遷移を許可できると述べています。しかし、これは私にはうまくいきません。「no_transition」を受け取るだけです。ここに私のサンプルコードがあります:

#include <iostream> #include <boost/msm/back/state_machine.hpp> #include <boost/msm/front/state_machine_def.hpp> #include <boost/msm/front/functor_row.hpp> #include <boost/any.hpp> using namespace std; namespace msm = boost::msm; using namespace msm::front; namespace mpl = boost::mpl; namespace { struct event1 {}; struct some_event{}; struct some_sm_ : public msm::front::state_machine_def<some_sm_> { struct State1 : public msm::front::state<> { template <class Event,class FSM> void on_entry(Event const& ,FSM&) {std::cout << "entering: State1" << std::endl;} template <class Event,class FSM> void on_exit(Event const&,FSM& ) {std::cout << "leaving: State1" << std::endl;} }; struct State2 : public msm::front::state<> { template <class Event,class FSM> void on_entry(Event const& ,FSM&) {std::cout << "entering: State2" << std::endl;} template <class Event,class FSM> void on_exit(Event const&,FSM& ) {std::cout << "leaving: State2" << std::endl;} }; typedef State1 initial_state; struct transition_table : mpl::vector< // Start Event Next // +---------+-------------+---------+ Row < State1 , boost::any , State2 >, Row < State1 , event1 , State2 > // +---------+-------------+---------+ > {}; template <class FSM,class Event> void no_transition(Event const& e, FSM&,int state) { std::cout << "no transition from state " << state << " on event " << typeid(e).name() << std::endl; } }; typedef msm::back::state_machine<some_sm_> some_sm; void test() { some_sm p; p.start(); p.process_event(some_event()); p.process_event(event1()); } } int main() { test(); return 0; }

実行すると、次の出力が生成されます。

入力: State1

イベント N12_GLOBAL__N_110some_eventE で状態 0 からの遷移なし

出発: State1

入力: State2

「some_event」で「State1」から「State2」への遷移が発生することを期待しますが、どうやらそれは発生しません。

何かが欠けているに違いないのですが、それが何かわかりません。

4

1 に答える 1