Построить иерархию классов с переопределяемыми функциями-обработчиками - PullRequest
0 голосов
/ 19 января 2012

В настоящее время я пытаюсь построить иерархию классов автоматически с помощью шаблонов C ++. Конечным результатом является класс обработчика сообщений, который предоставляет функции-обработчики для всех возможных сообщений, приведенных в списке типов.

Однако при наследовании от этой иерархии классов и попытке реализовать функцию-обработчик для выполнения кода приложения только для некоторых типов , C ++ не вызывает функцию из базового класса.

Ниже приведен минимальный и полный пример того, чего я пытаюсь достичь. Он не компилируется, потому что C ++ жалуется на отсутствие перегрузки для handle( const B& ).

#include <iostream>
#include <typeinfo>

// Typelist.
struct None {};

template <class H, class T = None>
struct Typelist {
    typedef H Head;
    typedef T Tail;
};

template <class TL>
struct Handler : public Handler<typename TL::Tail> {
    using Handler<typename TL::Tail>::handle;

    virtual void handle( const typename TL::Head& obj ) {
        std::cout << "Not handled! " << typeid( typename TL::Head ).name() << std::endl;
    }
};

template <>
struct Handler<None> {
    virtual void handle() {}
};

struct A {};
struct B {};

typedef Typelist<A, Typelist<B> > MsgList;

struct MyHandler : Handler<MsgList> {
    void handle( const A& a ) {
        std::cout << "A!" << std::endl;
    }
};

int main() {
    MyHandler handler;

    A a;
    B b;

    handler.handle( a );
    handler.handle( b );
}

1 Ответ

1 голос
/ 19 января 2012

Вам нужно использовать ручку от вас Handle<MsgList> в вашем MyHandler классе

using Handler<MsgList>::handle;

Прямо сейчас он скрыт и не перегружает имя handle в MyHandler классе. И с учетом кода Handler вы знаете это: -)

...