这是第二局部,无关无限状态机(FSM)的 C++ 实作局部,也等同于状态模式实现Prologue上一篇 谈 C++17 里的 State 模式之一 对于状态模式所牵扯到的基本概念做了一个综述性的梳理。所以是时候从这些概念中抽取咱们感兴趣的局部予以实作了。
C++ 实现(元编程实现)如果不采纳 DFA 实践推动的伎俩,而是在 C++11/17 的语境里思考实现状态模式,那么咱们应该从新梳理一下实践:
状态机 FSM:状态机总是无限的(咱们不可能去解决有限的状态汇合)。开始状态 S:Start State/Initial State以后状态 C:Current State下一状态 N:Next State终止状态:Terminated State (Optional)进入状态时的动作:enter-action来到状态时的动作:exit-action输出动作/输出流:input action,也能够是输出条件、或者事件对象等转换:Transition上下文:Context负载:Payload有的时候,Input Action 也被称作 Transition Condition/Guard。它的外延始终如一,是指在进入下一状态前通过条件进行断定状态变迁是否被许可。
状态机外围定义依据以上的设定,咱们决定了 fsm machine 的根底定义如下:
namespace fsm_cxx { AWESOME_MAKE_ENUM(Reason, Unknown, FailureGuard, StateNotFound) template<typename S, typename EventT = event_t, typename MutexT = void, // or std::mutex typename PayloadT = payload_t, typename StateT = state_t<S>, typename ContextT = context_t<StateT, EventT, MutexT, PayloadT>, typename ActionT = action_t<S, EventT, MutexT, PayloadT, StateT, ContextT>, typename CharT = char, typename InT = std::basic_istream<CharT>> class machine_t final { public: machine_t() {} ~machine_t() {} machine_t(machine_t const &) = default; machine_t &operator=(machine_t &) = delete; using Event = EventT; using State = StateT; using Context = ContextT; using Payload = PayloadT; using Action = ActionT; using Actions = detail::actions_t<S, EventT, MutexT, PayloadT, StateT, ContextT, ActionT>; using Transition = transition_t<S, EventT, MutexT, PayloadT, StateT, ContextT, ActionT>; using TransitionTable = std::unordered_map<StateT, Transition>; using OnAction = std::function<void(StateT const &, std::string const &, StateT const &, typename Transition::Second const &, Payload const &)>; using OnErrorAction = std::function<void(Reason reason, State const &, Context &, Event const &, Payload const &)>; using StateActions = std::unordered_map<StateT, Actions>; using lock_guard_t = util::cool::lock_guard<MutexT>; // ... };}这是重复迭代之后的成绩。
...