如何解决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 举报,一经查实,本站将立刻删除。