質問

現在、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 );
}

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top