【问题标题】:Build class hierarchy with overridable handler functions使用可覆盖的处理函数构建类层次结构
【发布时间】:2012-01-19 18:24:44
【问题描述】:

我目前正在尝试使用 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 );
}

【问题讨论】:

    标签: c++ templates typelist


    【解决方案1】:

    您需要在 MyHandler 类中使用 Handle&lt;MsgList&gt; 的句柄

    using Handler<MsgList>::handle;
    

    现在它是隐藏的,不要在 MyHandler 类中重载名称 handle。考虑到Handler 的代码,你知道这一点:-)

    【讨论】:

    • 哎呀...我完全忽略了这一点。 :-) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多