Я создаю конечный автомат, в котором переходы состояний описаны как вариант, то есть:
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>
Я знаю, как извлечь информацию о типе из таблицы и информацию о типе доступа изконкретный переход, но не знаю, как перевести возможные состояния в определение варианта (без дублирующих типов).
Любая идея приветствуется.Тем не менее, полиморфизм не является допустимым решением.Кроме того, сохранение текущего состояния внутри лямбды - это не вариант.
Спасибо и всего наилучшего!
PS: подпись конечного автомата выглядит так (я не публикую полный код, поскольку онне имеет значения для вопроса, имо):
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;
};