Реферат: Эффективное использование STL и шаблонов

template <class SState, class SEvent>

class SOnMoveFunctor

{

public:

inline void operator() ( SState & From, const SEvent & Event, SState & To )

{ From.OnExit( Event, To ); To.OnEnter( From, Event ); }

};

Стратегию по умолчанию (не вызывать никакую функцию) можно передать в качестве аргумента шаблона. Стратегия вызова функций, скорее всего, будет меняться чаще, чем стратегия действий при неизвестном событии. Поэтому ее имеет смысл поместить в списке аргументов перед стратегией реакции на неизвестное событие:

template <class SState, class SEvent,

class SFunctor = SEmptyFunctor<SState,SEvent>,

class SUnknownEventStrategy = SThrowStrategy<SEvent> >

class SFiniteStateMachine { . . . };

Еще один вопрос, связанный с событиями, состоит в том, что событие может быть сгенерировано внутри функции, вызываемой при выходе или входе в состояние. Для обработки таких событий надо соответствующим образом спроектировать функцию, принимающую событие. С учетом таких “внутренних” событий, надо предусмотреть очередь, в которую будут помещаться события. Код, который обрабатывает переходы, должен будет делать это до тех пор, пока очередь не опустеет. В качестве контейнера, подходящего для хранения событий, воспользуемся deque из STL. Поскольку нам нужны только вставка элементов в начало и исключение из конца контейнера, без произвольного доступа, контейнер deque подойдет лучше всего.

Осталось совсем немного. Иногда нужно привести автомат в исходное состояние. Как и в случае с событиями предусмотрим два варианта: обычная функция и перегруженный operator <<. Для перегруженного operator << нужно определить специальный манипулятор:

enum SMachineManipulator

{

ResetMachine = 0

};

. . .

inline SFiniteStateMachine & operator << ( SMachineManipulator Manipulator )

{

if ( Manipulator == ResetMachine )

return Reset();

return *this;

}

Теперь можно будет написать так:

// Принять событие Event1 и сбросить автомат в начальное состояние

MyMachine << Event1 << RestMachine;

Результатом работы автомата является состояние, в которое он перешел. Для получения текущего состояния напишем функцию и перегрузим оператор вывода в поток класса автомата:

К-во Просмотров: 414
Бесплатно скачать Реферат: Эффективное использование STL и шаблонов