Я пытаюсь использовать библиотеку boost :: msm для создания конечного автомата в моем коде. Кто-нибудь знает способ получить строковое имя (не int ID) состояния? Я пытаюсь получить это для целей регистрации / отладки. Например, в функции no_transition я получаю идентификатор состояния, но я пытаюсь получить имя, чтобы его было легче читать:
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";
}
};
Любые идеи будут великолепны. Спасибо!
Лучший вариант: использование посетителя.
Посмотрите на http://www.boost.org/doc/libs/1_53_0/libs/msm/doc/HTML/examples/SM-2Arg.cpp
Используйте последний аргумент (state_id) no_transition, вы можете получить имя из массива:
static char const * const state_names [] = {«State1», «State2», …};
печати (state_names [state_id]);
Обратите внимание на то, что идентификатор состояния предоставляется только для целей отладки. Идентификатор генерируется во время компиляции и зависит от порядка записей в таблице переходов.
Ссылки на документацию МСМ:
Вы можете достичь желаемого эффекта, используя следующий код:
#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;}