Я пока не знаю, как динамически создать FSM с использованием надстройки msm, например, для чтения шаблонных xml-файлов, описывающих машину. Есть идеи, как решить проблему? Я хочу использовать функторный подход с надстройкой msm 1.61. Заранее благодарю за идеи и мои извинения за то, что ничего еще не представили, но я действительно должен пока догадаться …
ОБНОВИТЬ
Я добился небольшого прогресса, так что я могу создать базовый класс для внешнего интерфейса обычным способом:
class SMBase : public msmf::state_machine_def<SMBase>
{
...
};
using SMBaseBackend = msm::back::state_machine<SMBase>;
class SMDerived : public SMBase
{
...
};
using SMDerivedBackend = msm::back::state_machine<SMDerived>;class SMDerived2 : public SMBase
{
...
};
using SMDerived2Backend = msm::back::state_machine<SMDerived2>;
Тем не менее, сам конечный автомат управляется бэкэндом, и я пока не вижу способа выбрать последний во время выполнения (например, используя
map<int, smart_pointer<SMBaseBackend> >
). Любая помощь приветствуется.
Boost.MSM не поддерживает динамическое создание структуры конечного автомата. MSM — это Meta State Machine, а в этом контексте Meta означает время компиляции. Итак, вся структура конечного автомата создается во время компиляции. Вы можете понять, почему Boost.MSM использует этот подход в следующем документе:
http://www.boost.org/doc/libs/1_61_0/libs/msm/doc/HTML/pr01.html
Второй абзац «Еще одна государственная машинная библиотека? Зачем?» описывает недостаток создания структуры динамического автомата.
Возможно, вы захотите узнать альтернативы.
Boost.Statechart не поддерживает ни того, ни другого. Следующие документы описывают причину:
http://www.boost.org/doc/libs/1_61_0/libs/statechart/doc/rationale.html#DynamicConfigurability
Согласно документу, Boost.Statechart поддерживает очень ограниченное динамическое объединение. В документе говорится, что «Однако это не означает, что невозможно динамически формировать машину, реализованную с помощью этой библиотеки. Например, средства защиты могут использоваться для выполнения различных переходов в зависимости от ввода, доступного только во время выполнения».
Однако есть библиотека конечных автоматов, которая поддерживает динамическое создание конечных автоматов. QStateMachine Qt это все. Увидеть http://doc.qt.io/qt-5/statemachine-api.html
Существует своего рода обходной путь, который отлично работает для установок, когда не нужно выбирать из множества конечных автоматов во время выполнения:
Определите одну охватывающую родительскую машину состояний и внедрите другие в автоматах. Затем на уровне времени выполнения можно «пропустить» соответствующий подсистему, используя таблицу переходов родительского конечного автомата с помощью и вызывая соответствующий process_event (Соответственно_event ()).
Работает очень хорошо, только current_state теперь просто возвращает состояние родительского уровня.