Реферат: Эффективное использование STL и шаблонов
События и состояния хотелось бы представить в виде абстрактных типов, определяемых пользователем.
По возможности, автомат хотелось бы сделать гибким и легко расширяемым.
По возможности, хотелось бы проверять описание автомата.
По возможности, хотелось бы исключить неправильное использование автомата.
Требования 1 и 7 означают, что все описание автомата хорошо бы поместить в конструктор. В конструкторе же надо проверять правильность описания – требование 6.
class SFiniteStateMachine { public: SFiniteStateMachine( <описаниеавтомата> ); . . . private: SFiniteStateMachine(); }; |
Требование 4 означает, что нужно использовать шаблон, параметрами которого будут типы события и состояния.
template <class SState, class SEvent> class SFiniteStateMachine { . . . }; |
Требование 2 означает, что не должно использоваться никаких небезопасных операций вида reinterpret_cast.
О требовании 5 поговорим позже, а сейчас обсудим требование 3. В общем случае количество возможных состояний (то есть количество столбцов в таблице) неизвестно. Неизвестно также и количество событий (то есть количество строк в таблице). Получается, что у конструктора класса, который будет представлять собой автомат, переменное количество аргументов. С первого взгляда кажется, что эту проблему легко решить с помощью функций языка C va_arg(), va_copy(), va_end() и va_start() ([6]). Однако, не все так просто. Для этих функций обязательно нужно предусмотреть признаки окончания списков, а у нас количество элементов в строках и столбцах неизвестно. Размерность же задавать нежелательно. Кроме того, эти функции работают гарантированно только для POD (Plain Old Data), а для произвольных типов возможны неприятности.
Подойдем с другой стороны. Напишем, каким хотелось бы видеть конструктор автомата:
SFiniteStateMachine A( <Стартовое состояние>, <Список состояний>, <Список переходов для состояний> ); |
При таком вызове конструктора путем форматирования текста, набранного моноширинным шрифтом, описанию автомата удастся придать вид таблицы. Пофантазируем:
SFiniteStateMachine A( К-во Просмотров: 423
Бесплатно скачать Реферат: Эффективное использование STL и шаблонов
|