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 (将#修改为@)