使用可覆盖的处理函数构建类层次结构

时间:2012-01-19 18:24:45

标签: c++ templates typelist

我目前正在尝试使用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 个答案:

答案 0 :(得分:1)

您需要在Handle<MsgList>班级

中使用MyHandler处理的句柄
using Handler<MsgList>::handle;

现在它已被隐藏,并且不会重载handle类中的名称MyHandler。考虑到Handler的代码,您知道: - )