我正在构建一个状态机,其中状态转换被描述为一种变体,即:
using table = std::variant<
/* state event followup-state */
transition<start, success<sock>, connecting>,
transition<start, exception, failed>,
transition<connecting, success<>, connected>,
transition<connecting, exception, failed>,
transition<connected, exception, failed>
>;
和转换是一个简单的类型:
template <typename ENTRY_STATE, typename EVENT, typename NEXT_STATE>
struct transition {
using entry_state = ENTRY_STATE;
using event = EVENT;
using next_state = NEXT_STATE;
};
状态类是非多态的(也不应该是)。我现在的问题是如何定义另一个变体,该变体能够存储表类型中找到的所有可能状态(最好没有重复)。需要类型以类型安全和非多态的方式存储实际状态。
从上表中,我们有一组独特的条目状态:
entry_states = <start,connecting,connected>
以及一组后续状态:
followup_states = <connecting, connected, failed>
因此生成的变体定义应为:
using states = std::variant<entry_states JOINT followup_states>;
=> using states = std::variant<start,connecting,connected, failed>
我知道如何从表中提取类型信息并访问特定转换的类型信息,但不知道如何将可能的状态转移到变体定义中(没有重复的类型)。
任何想法表示赞赏。然而,多态性并不是一个有效的解决方案。另外,将当前状态保存在 lambda 中也不是一种选择。
谢谢,最好的!
PS:状态机签名看起来像这样(我没有发布完整的代码,因为它对这个问题没有意义,imo):
template <typename TransitionTable, typename Context>
class state_machine {
public:
template <typename State, typename Event>
auto push(State & state, Event & event) {
...
}
protected:
*using states = std::variant<???>;*
states current_state;
};