Pregunta

Actualmente estoy tratando de construir una jerarquía de clase automáticamente usando plantillas C ++. El resultado final es una clase de controlador de mensajes que proporciona funciones de controlador para todos los mensajes posibles, dadas en un typeList.

Sin embargo, al heredar de esa jerarquía de clase e intentar implementar la función del controlador para hacer realmente el código de aplicación Solo para algunos tipos, C ++ no está llamando a la función desde la clase base.

El siguiente es un ejemplo mínimo y completo lo que estoy tratando de lograr. No se compila porque C ++ se queja de no encontrar una sobrecarga para 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 );
}

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top