2012-01-19 18 views
0

現在、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

あなたは今、それが隠されているとMyHandlerクラスに名前handleに過負荷をかけないでください、あなたからあなたのMyHandlerクラスのHandle<MsgList>

using Handler<MsgList>::handle; 

をハンドルを使用する必要があります。そして、Handlerのコードを考慮すると、あなたはこれを知っています:-)

+0

私はそれを完全に見落としました。 :-) ありがとうございました! – stschindler

関連する問題