Если вы пишете свой собственный класс - рассмотрите возможность реализации универсального FSM, а затем заполните его состояниями и событиями.
В основном это был бы простой интерфейс с чем-то вроде этого в качестве методов:
create();
addState(someState, stateFunction);
addEdge(someStateOrig, someStateDest, event);
processEvent(event);
start(startFromState);
Это должно покрыть это. Затем, когда вы создаете FSM - передайте его своим состояниям и функциям, выполняемым при достижении состояния, и событиям, которые заставляют FSM переходить из одного состояния в другое.
Затем вы просто запускаете FSM в каком-то состоянии, которое будет состоянием запуска, и подаете события.
Если вам нужно изменить события, функции или состояния - реализация FSM остается прежней, вы меняете код, который его использует, как и должно быть.
Это более или менее то, что дает вам Boost.FSM, но вы сказали, что не можете его использовать - так что делайте это самостоятельно: -)