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

создание и использование автомата

. . .

}

catch ( std::exception & Exception )

{

// Поймаем и стандартное исключение и исключение, сгенерированное автоматом

}

Вернемся к конструкторам. Поскольку они имеют дело со списками переменной длины, то для сохранения элементов логично воспользоваться контейнерами, предоставляемыми библиотекой STL ([3]). Для хранения одномерного списка воспользуемся контейнером vector, а для таблицы переходов – вектором векторов:

std::vector< std::vector<StateType> > Transitions;

Алгоритмы STL помогут находить событие в списке событий:

std::vector<EventType>::const_iterator k( std::find( Events.begin(),

Events.end(), EntryEvent ) );

Поскольку контейнер vector поддерживает operator [], то для поиска состояния, в которое необходимо совершить переход, в таблице переходов можно воспользоваться подобной конструкцией:

NewState = Transitions[ EventIndex ] [ StateIndex ];

где соответствующие индексы могут быть вычислены с помощью алгоритма STL distance:

inline int GetStateIndex( const StateType & State ) const

{

return std::distance( States.begin(), std::find( States.begin(), States.end(), State ) );

}

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

SFiniteStateMachine & AcceptEvent( const EventType & Event )

{

. . .

}

и

inline SFiniteStateMachine & operator << ( const EventType & Event )

{ return AcceptEvent( Event ); }

Перегрузка operator << даст возможность использовать автомат в таком стиле:

// Принять события Event1, Event2 и Event3

MyMachine << Event1 << Event2 << Event3;

Остается вопрос: что делать, если придет событие, для которого у автомата нет описания переходов? Возможны варианты: просто проигнорировать такое событие, сгенерировать исключение или сделать что-то, определяемое пользователем. Воспользуемся идеей стратегий ([4]) и включим в число аргументов шаблона функтор, который будет определять нужную стратегию поведения. Такой подход вполне соответствует требованию 5. При этом можно задать стратегию по умолчанию – например, генерировать исключение. Теперь заголовок шаблона выглядит так:

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