gpt4 book ai didi

c++ - 递归c++模板问题

转载 作者:行者123 更新时间:2023-11-30 02:11:01 24 4
gpt4 key购买 nike

假设我有一个模板类,它从源中获取消息,对它们做一些智能处理,然后将它们发送到接收器:

template <typename Source, typename Sink>
class MsgHandler
{
MsgHandler(Source* pSource)
: m_pSource(pSource)
{
m_pSource->setHandler(this);
}
};

//Now the definition of the Source:

template <typename Handler>
class Source
{
void setHandler(Handler* pHandler)
{
m_pHandler = pHandler;
}
};

很好,但现在我无法真正制作源或处理程序。例如:

MsgHandler<FileSource<MsgHandler<FileSource.... recursing parameters...
FileSource<MsgHandler<FileSource<MsgHandler.... same problem when trying to build a source

有没有办法在不为 Handler 使用虚拟基类的情况下解决这个问题?

虚基类解决方案:

class MyHandler
{
virtual ~MyHandler() {};
virtual void handleSomething() = 0;
};

template <typename Source, typename Sink>
class MsgHandler : public MyHandler
{
MsgHandler(Source* pSource)
: m_pSource(pSource)
{
m_pSource->setHandler(this);
}
void handleSomething() {}
};

class Source
{
void setHandler(MyHandler* pHandler)
{
m_pHandler = pHandler;
}
};

最佳答案

您可以为处理程序的源参数使用模板化参数:

class MySink;
template <template<typename Handler> class Source, typename Sink>
class MsgHandler
{
Source<MsgHandler>* m_pSource;

MsgHandler(Source<MsgHandler>* pSource)
: m_pSource(pSource)
{
m_pSource->setHandler(this);
}
};

//Now the definition of the Source:

template <typename Handler>
class Source
{
void setHandler(Handler* pHandler)
{
m_pHandler = pHandler;
}
};

//Now you can define variables like this
MsgHandler<Source, MySink> myHandler;

当然,这要求 MsgHandler 的 Source 参数是一个只有一个参数(处理程序)的模板,但是如果您可以接受该约束,这将解决您的定义问题(否则您可能(或可能不取决于什么正是你会尝试)能够使用一些额外的模板 foo 来规避这个限制(创建另一个模板,它将处理程序作为参数并且想到了相应的 SourcesType 的 typedef)。

在这种情况下,添加一个 typedef Source<MsgHandler> SourceType 也是一个好主意。到 MsgHandler 以使 Source-Instantiation 对调用者可见(而不是要求程序员猜测 MsgHandler 将实例化 Source。

关于c++ - 递归c++模板问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com