Нужна помощь с шаблонами C ++ - PullRequest
2 голосов
/ 08 января 2010

Я вполне уверен, что это вопрос шаблона, так как я не могу решить его каким-либо другим способом - но не шаблонные решения также приветствуются.

У конечного автомата есть несколько программных состояний, и каждое состояние может реагировать на несколько событий.

Итак, я хочу определить классы для Event, State и FSM. FSM имеет коллекцию (возможно векторную, может быть связанным списком, если STL создает проблемы во встроенной системе) состояний, а State - коллекцию событий.

Каждое состояние и событие имеют уникальный идентификатор и строку имени для отладки морских свиней.

Чтобы быть неуклюжим, я не хочу, чтобы идентификаторы были целыми числами, а были элементами перечисления. Каждый FSM имеет разные перечисления для своих состояний и событий.

Как лучше всего это кодировать? Можете ли вы привести пример с двумя простыми FSM или с одним FSM с двумя состояниями, каждое с двумя событиями?

Например, если у меня есть

enum myEvents {a, b, c};
enum hisEvents {d, e, f, g};

Я хочу иметь возможность объявить класс Event, который принимает конструкторы params

(myEvents a,char *"event_a")
и
(hisEvents g,char* "event_g")
Обратите внимание, что я не хочу просто перегружать конструктор, так как это ограничительно - что, если будут добавлены новые перечисления событий?

И аналогично со штатами, у каждого из моих FSM есть список состояний.

Или я просто анель, настаивающий на перечислениях для eventId, когда было бы на намного проще передать int?

спасибо.


Кстати, я бы предпочел избегать Boost, поскольку он сам не определился с тем, насколько хорошо он работает во встроенных системах. Я предпочитаю собственную разработку для полного контроля.

Ответы [ 2 ]

2 голосов
/ 08 января 2010

Я не уверен, что правильно все понимаю, но попробую:

Я предполагаю, что вы хотите определить конечный автомат путем определения переходов; например "когда в состоянии 'myEvents' и вы видите 'do' event_a '"

class State {};
template<T> RealState : State
{
    static void Add(T event, char*) { /* save stuff */ }
};

class Event {};
template<T> RealEvent : Event    {
    RealEvent(T event, char* name) {RealState<T>(event, name); }
};

Некоторые из них, как вам нужно было бы придерживаться действий и тому подобного, и вам захочется немного испортить его, чтобы получить больше чем один конечный автомат, но я надеюсь, что это поможет вам начать.

1 голос
/ 08 января 2010

Хотя я понимаю, почему вы хотите избежать избыточности кода, применяя основы конечного автомата в целом, я не понимаю, почему вы хотите реализовать это самостоятельно.

Взгляните на существующие реализации, такие как Boost.Statechart или любую другую, наиболее подходящую для вашего сценария использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...