微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ CRTP 模式和虚函数调用

如何解决C++ CRTP 模式和虚函数调用

这是我的实现:

#include <iostream>

class Heartbeat {};

template <typename T,template<typename> class crtpType>
struct CRTP
{
    T& underlying() { return static_cast<T&>(*this); }
    T const& underlying() const { return static_cast<T const&>(*this); }
private:
    CRTP(){}
    friend crtpType<T>;
};

class MessageCracker
{
public:
  virtual ~MessageCracker() {}
  virtual void onMessage( const Heartbeat&) {}
};

template <typename T>
struct cmessageCracker: MessageCracker,CRTP<T,cmessageCracker>
{
    void onMessage( const Heartbeat&) { std::cout << "cmessageCracker: " << this->underlying().m_dummy << std::endl; }
};

template <typename T>
class cmessageHandler : public cmessageCracker<cmessageHandler<T>>
{
    cmessageHandler(): m_dummy(0) {}
    friend class  cmessageCracker<cmessageHandler<T>>;
public:
    /* other function */
private:
    int m_dummy;
};

class MyType {};

template <>
class cmessageHandler<MyType> : public cmessageCracker<cmessageHandler<MyType>>
{
    friend class  cmessageCracker<cmessageHandler<MyType>>;
public:
    void onMessage( const Heartbeat&) { std::cout << "cmessageHandler<MyType>" << std::endl; }
};

int main(int argc,const char *argv[],char** env)
{
    MessageCracker* pH = new cmessageHandler<MyType>();
    Heartbeat   hbt;
    pH->onMessage(hbt);
    delete pH;
    return 0;
}

编译时 g++ (GCC) 7.3.1 20180303(红帽 7.3.1-5) 版权所有 (C) 2017 Free Software Foundation,Inc. 这是免费软件;请参阅复制条件的来源。没有 保修单;甚至不是为了特定目的的适销性或适用性。

我收到此错误

''' crtpVirtMain.cpp:在“void cmessageCracker::onMessage(const Heartbeat&) [with T = cmessageHandler]”的实例化中: crtpVirtMain.cpp:56:1:从这里需要 crtpVirtMain.cpp:25:93: 错误:“class cmessageHandler”没有名为“m_dummy”的成员 ) { std::cout underlying().m_dummy

除了提供

template <>
struct cmessageCracker<cmessageHandler<MyType>>: MessageCracker,CRTP<cmessageHandler<MyType>,cmessageCracker>
{
    void onMessage( const Heartbeat&) { std::cout << "cmessageHandler<MyType>"  << std::endl; }
};

如果我在 MessageCracker 中有很多 onMessage() 有什么更好的方法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。