Listing 3: The state.

template <class T, class EV, class CMP>
class Transition
{
    friend State<T,EV,CMP>;
public:
    State<T,EV,CMP>* operator()( const T& _T, const EV& ev ) throw() { 
        (*m_evAction)(_T,ev);
        return m_stNext;
    }
protected:
    Transition( const State<T,EV,CMP>& stNext, Action<T,EV>* evAction ) : 
    m_stNext(const_cast<State<T,EV,CMP>*>(&stNext)), m_evAction(evAction) {
  }
    ... // Other member information
};
template <class T, class EV, class CMP = std::less<EV> >
class State
{
    // State Transition Table Type
    typedef std::map<const EV,const Transition<T,EV,CMP>*,CMP>
        TransitionTable;
public:
    typedef State<T,EV,CMP> state_type;
    typedef EventAction<T,EV>::HANDLE HANDLE;
public:
    State( HANDLE hEnter = 0, HANDLE hExit = 0 ); {
        if ( hEnter == 0 ) {
            m_evEnter = new NoAction<T,EV>;
        }
        else { m_evEnter = new EventAction<T,EV>(hEnter); }
        if ( hExit == 0 ) {
            m_evExit = new NoAction<T,EV>;
        }
        else { m_evExit = new EventAction<T,EV>(hExit); }
    }
    ~State() {
        TransitionTable::iterator iter;
        for ( iter = m_stTable.begin(); iter != m_stTable.end(); iter++ ) {
            delete const_cast<Transition<T,EV,CMP>*>( iter->second );
        }
        delete m_evEnter;  delete m_evExit;
    }
    ... // other API functions not shown
private:
    TransitionTable m_stTable;
    Action<T,EV>* m_evEnter;
    Action<T,EV>* m_evExit;
};