過剰なハンドラー関数を使用してクラス階層を構築します
質問
現在、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 );
}
正しい解決策はありません
所属していません StackOverflow