Question

J'essaie actuellement de créer automatiquement une hiérarchie de classe en utilisant des modèles C ++. Le résultat final est une classe de gestionnaire de messages qui fournit des fonctions de gestionnaire pour tous les messages possibles, donnés dans une liste de type.

Cependant, lorsqu'il hérite de cette hiérarchie de classe et essayant d'implémenter la fonction de gestionnaire pour réellement effectuer le code d'application Pour certains types seulement, C ++ n'appelle pas la fonction de la classe de base.

Ce qui suit est un exemple minimal et complet de ce que j'essaie de réaliser. Il ne compile pas car C ++ se plaint de ne pas trouver de surcharge pour 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 );
}

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top