1

特定の状態に入ると、別の状態に定期的に遷移する必要がある場合と、前の状態に戻る必要がある場合があります。

たとえば、状態 ABC があり、遷移 S が状態 A から C に移動し、B から C に移動するとします。遷移 T は、S が状態 A で発生したときに C を A に移動し、状態 B で発生したときに C を B に移動する必要があります。

以下のコードでは、状態 B で遷移 S が発生するため、遷移 T が状態 B に戻るようにします (現在は状態 A に戻ります)。

#include <boost/mpl/list.hpp>

#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/event.hpp>
#include <boost/statechart/transition.hpp>

// states
struct A;
struct B;
struct C;
struct D;

// events
struct S : boost::statechart::event<S> {};
struct T : boost::statechart::event<T> {};
struct U : boost::statechart::event<U> {};

// fsm
struct FSM : boost::statechart::state_machine<FSM, B> {};

// fully defined states/transitions
struct A : boost::statechart::simple_state<A, FSM> {
    typedef boost::statechart::transition<S, C> reactions;

    A() { std::cout << "entered A" << std::endl; }
};

struct B : boost::statechart::simple_state<B, FSM> {
    typedef boost::statechart::transition<S, C> reactions;

    B() { std::cout << "entered B" << std::endl; }
};

struct C : boost::statechart::simple_state<C, FSM> {
    typedef boost::mpl::list<
                boost::statechart::transition<T, A>,
                boost::statechart::transition<T, B>,
                boost::statechart::transition<U, D> > reactions;

    C() { std::cout << "entered C" << std::endl; }
};

struct D : boost::statechart::simple_state<D, FSM> {
    D() { std::cout << "entered D" << std::endl; } 
};

int main() {
    FSM fsm;

    fsm.initiate();

    fsm.process_event(S());
    fsm.process_event(T());
    fsm.process_event(S());
    fsm.process_event(U());

    return 0;
}

上記のコードは次を返します。

entered B
entered C
entered A
entered C
entered D

私は代わりに見たい:

entered B
entered C
entered B
entered C
entered D

Boost::Statechart を使用してこれを行うクリーンな方法はありますか?

4

1 に答える 1