Listing 4: Base action class.

// Base action class

template <class T, class EV>
struct Action
{
    virtual void operator()( const T&, const EV& ) throw() = 0;
};
// No Action default
template <class T, class EV>
struct NoAction : public Action<T,EV>
{
    void operator()( const T&, const EV& ) throw() {};
};
//  Action Handler for "T"
template <class T, class EV>
struct EventAction : public Action<T,EV>
{
    typedef void (T::*HANDLE)( const EV& ev );
    explicit EventAction( HANDLE hAction ) : 
        m_hAction(hAction) {}
    void operator()( const T& _T, const EV& ev ) throw() { 
        (_T.*m_hAction)(ev);
    }
private:
     HANDLE m_hAction;
};