Совместные подпрограммы в C++ - это действительно мощный метод для реализации государственных машин, однако примеры, которые я нахожу в Интернете, чрезмерно упрощены, например. они обычно представляют собой своего рода итератор, который после вызова некоторой «следующей» процедуры движется вперед, зависящий только от начальных аргументов сопрограммы. Однако в достаточно сложных состояниях на основе состояний каждый следующий шаг зависит от конкретного события, которое было вызвано возобновлением работы, а также некоторых обработчиков событий по умолчанию должны быть реализованы для событий, которые могут произойти в любое время.Событийный конечный автомат в C++ с сопрограммами
Предположим, у нас есть простой автомат для телефона.
СОСТОЯНИЕ: HOOK OFF -> [ЭВТ: ДИАЛ TONE] -> [STATE: НАБОР] -> [ЭВТ: набранный номер] -> STATE: ГОВОРИТЬ.
Теперь мне нужна сопрограмма, которая увидит что-то вроде.
PhoneSM()
{
HookOf();
Yield_Till(DialTone_Event);
Dial();
Yield_Till(EndOfDial_Event);
Talk();
...
}
e.g. Требования
Yield_Till будет продолжаться только тогда, когда конкретное событие было получить (как ???), когда couroutine пробег resumed.If нет, то он должен дать снова.
Yield_Till должен знать, как запускать события для обработчиков по умолчанию, таких как Hangup_Event, потому что на самом деле это может произойти в любое время, и будет громоздким, чтобы каждый раз добавлять вызов yield.
Любая помощь в реализации C++ (only !!!) или готовых инфраструктур для удовлетворения требований будет высоко оценена.