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);
}
私はそれを完全に見落としました。 :-) ありがとうございました! – stschindler