C++ Boost状态图:返回到以前的状态

C++ Boost状态图:返回到以前的状态,c++,boost,boost-statechart,C++,Boost,Boost Statechart,我有一个状态机,如果我进入一个特定的状态,有时我需要定期转换到另一个状态,有时我需要返回到以前的状态 例如,有状态A B C,假设转换S将状态A移动到C,并从B移动到C。我需要转换T在状态A中发生时将C移动到A,在状态B中发生时将C移动到B 在下面的代码中,转换S发生在状态B中,因此我希望转换T返回到状态B(而当前,它返回到状态A) 我想看到的是: entered B entered C entered B entered C entered D 使用Boost::Statechart有什么干

我有一个状态机,如果我进入一个特定的状态,有时我需要定期转换到另一个状态,有时我需要返回到以前的状态

例如,有状态A B C,假设转换S将状态A移动到C,并从B移动到C。我需要转换T在状态A中发生时将C移动到A,在状态B中发生时将C移动到B

在下面的代码中,转换S发生在状态B中,因此我希望转换T返回到状态B(而当前,它返回到状态A)

我想看到的是:

entered B
entered C
entered B
entered C
entered D

使用Boost::Statechart有什么干净的方法可以做到这一点吗?

我找到了一种~okay~方法,为状态创建枚举映射,将以前的状态存储在最外层的上下文(顶级fsm)中,然后对T事件使用自定义反应:

#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>
#include <boost/statechart/custom_reaction.hpp>

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

// state enum mapping
enum class state_mapping {
    A = 0,
    B,
    C,
    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> {
    state_mapping previous_state = state_mapping::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; }
    virtual ~A() { outermost_context().previous_state = state_mapping::A; }
};

struct B : boost::statechart::simple_state<B, FSM> {
    typedef boost::statechart::transition<S, C> reactions;
    
    B() { std::cout << "entered B" << std::endl; }
    virtual ~B() { outermost_context().previous_state = state_mapping::B; }
};

struct C : boost::statechart::simple_state<C, FSM> {
    typedef boost::mpl::list<
                boost::statechart::custom_reaction<T>,
                boost::statechart::transition<U, D> > reactions;
                
    C() { std::cout << "entered C" << std::endl; }
    
    boost::statechart::result react(const T&) {
        
        switch(outermost_context().previous_state) {
            
        case state_mapping::A:
            return transit<A>();
        case state_mapping::B:
            return  transit<B>();
        default:
            return discard_event();
            
        }
        
    }
};

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;
}
#包括
#包括
#包括
#包括
#包括
#包括
//州
结构A;
结构B;
结构C;
结构D;
//状态枚举映射
枚举类状态映射{
A=0,
B
C
D
};
//事件
结构S:boost::statechart::event{};
struct:boost::statechart::event{};
结构U:boost::statechart::event{};
//密克罗尼西亚联邦
struct FSM:boost::statechart::state\u机器{
状态映射前一个状态=状态映射::B;
};
//完全定义的状态/转换
结构A:boost::statechart::simple\u state{
typedef boost::statechart::过渡反应;
A(){std::cout请提供一个
entered B
entered C
entered B
entered C
entered D
#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>
#include <boost/statechart/custom_reaction.hpp>

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

// state enum mapping
enum class state_mapping {
    A = 0,
    B,
    C,
    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> {
    state_mapping previous_state = state_mapping::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; }
    virtual ~A() { outermost_context().previous_state = state_mapping::A; }
};

struct B : boost::statechart::simple_state<B, FSM> {
    typedef boost::statechart::transition<S, C> reactions;
    
    B() { std::cout << "entered B" << std::endl; }
    virtual ~B() { outermost_context().previous_state = state_mapping::B; }
};

struct C : boost::statechart::simple_state<C, FSM> {
    typedef boost::mpl::list<
                boost::statechart::custom_reaction<T>,
                boost::statechart::transition<U, D> > reactions;
                
    C() { std::cout << "entered C" << std::endl; }
    
    boost::statechart::result react(const T&) {
        
        switch(outermost_context().previous_state) {
            
        case state_mapping::A:
            return transit<A>();
        case state_mapping::B:
            return  transit<B>();
        default:
            return discard_event();
            
        }
        
    }
};

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;
}