6

boost::msm ライブラリを使用して、コード内にステート マシンを作成しようとしています。状態の文字列名 (int id ではない) を取得する方法を知っている人はいますか? ロギング/デバッグの目的でこれを取得しようとしています。たとえば、no_transition 関数では状態 ID を取得しますが、読みやすいように名前を取得しようとしています。

template <class Event ,class Fsm>
    void no_transition(Event const& e, Fsm& fsm, int stateId)
    {
        //This is what I'm trying: 
        auto state = fsm.get_state_by_id(stateId); //This returns a boost::msm::front::default_base_state. Anything I can override in there to set a name?
        const char* stateName = state->getStateName(); //I want to do something like this since I can do e.getEventId()

        print("FSM rejected the event %s as there is no transition from current state %s (%d)\n", e.getEventId(), stateName, stateId);
    }

イベントと状態を定義する方法は次のとおりです。

struct Idle : front::state<> {
 static const char* const getStateName() {
        return "Idle";
    }
};

イベント:

struct SampleEvent {
    SampleEvent() {}
    static const char* const getEventId() {
        return "SampleEvent";
    }
};

どんなアイデアでも素晴らしいでしょう。ありがとう!

4

2 に答える 2

5

次のコードを使用して、目的の効果を得ることができます。

 #include <boost/msm/back/tools.hpp>
 #include <boost/msm/back/metafunctions.hpp>
 #include <boost/mpl/for_each.hpp>
  .......
  .......
    template <class Event ,class Fsm>
    void no_transition(Event const& e, Fsm& fsm, int stateId){
        typedef typename boost::msm::back::recursive_get_transition_table<FSM>::type recursive_stt;
        typedef typename boost::msm::back::generate_state_set<recursive_stt>::type all_states;
        std::string stateName;
        boost::mpl::for_each<all_states,boost::msm::wrap<boost::mpl::placeholders::_1> >(boost::msm::back::get_state_name<recursive_stt>(stateName, state));
        std::cout << "No transition from state: " << stateName << std::endl;}
于 2013-10-17T08:11:56.867 に答える