Теперь можно будет написать так:
// Принять событие Event1 и сбросить
автомат в начальное состояние
MyMachine << Event1 <<
RestMachine;
|
Результатом работы автомата является состояние, в
которое он перешел. Для получения текущего состояния напишем функцию и
перегрузим оператор вывода в поток класса автомата:
inline StateType GetCurrentState( void ) const { return CurrentState;
}
template <class SState,
class SEvent,
class SFunctor,
class
SUnknownEventStrategy >
ostream &
operator<< (ostream &
Stream,
const
SFiniteStateMachine<_SState, _SEvent,
_SFunctor,_SUnknownEventStrategy> & Machine )
{
return Stream <<
Machine.GetCurrentState();
}
|
Теперь, если для класса состояния определен оператор
вывода в поток, можно написать такой фрагмент кода:
MyMachine
<< Event1 << RestMachine;
cout
<< MyMachine; // Эквивалентно cout <<
MyMachine.GetCurrentState();
|
Как уже говорилось, для сокращения времени набора кода
и удобочитаемости определены несколько макросов. Они требуют предварительного
определения подстановки для типов событий и состояний. Требование связано с
тем, что использование вложенных директив препроцессора невозможно. Шаблон же
использует Proxy классы, которым также нужны сведения о типах. Поэтому для
использования макросов придется сделать так: