У меня есть два подчиненных SM внутри моего основного SM. Я хочу, чтобы иметь возможность прыгать в любой из основного SM, но также перейти от одного sub SM к другому SM. Но я не могу. Я могу перейти от основного SM к sub SMs и от один от SM SM в другой, но когда я добавляю «взаимные» переходы между sub SM, компиляция терпит неудачу с ~ 10 ошибками, жалующимися на разные вещи , Я полагаю, это связано с тем, что компилятор переходит в рекурсивный спин.Прыжки между sub SMs в boost :: msm
Я предполагаю, что могу добавить фиктивное состояние в основной SM с анонимным переходом в целевой SM SM. Но тогда я потерял бы реальное событие, которое вызвало переход, и я не хочу этого (он содержит данные).
Вот некоторый тестовый код с ошибочной строкой закомментировать
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
namespace {
using namespace boost::msm;
using namespace boost::msm::front;
namespace mpl = boost::mpl;
struct EvGotoSub1 {};
struct EvGotoSub2 {};
struct MainSM_;
using Main = back::state_machine<MainSM_>;
struct Sub1SM_;
using Sub1 = back::state_machine<Sub1SM_>;
struct Sub2SM_;
using Sub2 = back::state_machine<Sub2SM_>;
struct Sub1SM_ : state_machine_def<Sub1SM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub2, Sub2, none, none>
> {};
};
struct Sub2SM_ : state_machine_def<Sub2SM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
// Uncomment line below to break things
//Row<Started, EvGotoSub1, Sub1, none, none>
> {};
};
struct MainSM_ : state_machine_def<MainSM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub1, Sub1, none, none>,
Row<Started, EvGotoSub2, Sub2, none, none>
> {};
};
}
int main() {
Main main;
main.start();
main.process_event(EvGotoSub1());
main.process_event(EvGotoSub2());
main.process_event(EvGotoSub1());
}
Да, ваши предположения верны. Это именно то, что я искал! – Kalle