ブースト 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」への遷移が発生することを期待しますが、どうやらそれは発生しません。
何かが欠けているに違いないのですが、それが何かわかりません。