我正在设计两个封装生产者和消费者的类。一个类执行单线程处理,另一个类(此处未显示)执行两个线程。
生产者和消费者通过模板参数传递给每个“线程类”。
*this
被传递给生产者以启用对每条消息的回调:
template<class PRODUCER, class CONSUMER>
class SingleThread
{
SingleThread() : _prod(*this){}
void processMessage(const char* message, int len)
{
int d = _cons.doSomething(message, len);
// Code omitted
}
PRODUCER<SingleThread<>> _prod; // Cyclical dependency
CONSUMER _cons;
};
每个生产者通过模板参数接收线程类作为回调:
template<class THREADING_CALLBACK>
class Producer
{
Producer(THREADING_CALLBACK& cb) : _cb(cb){}
// A lot of code omitted
void receiveMessage(const char* message, int len)
{
_cb.processMessage(message, len);
}
THREADING_CALLBACK& _cb;
};
但是我有循环模板依赖的问题。 SingleThread
将 Producer
作为模板参数,但 Producer
需要 SingleThread
:
SingleThread<Producer<SingleThread<Producer<....>, Consumer>, Consumer>
我应该如何(重新)构建这个设计?
最佳答案
您可以省略模板参数:
template<class THREADING_CALLBACK>
class Producer
{
public:
Producer(THREADING_CALLBACK& cb) : _cb(cb){}
void receiveMessage(const char* message, int len)
{
_cb.processMessage(message, len);
}
THREADING_CALLBACK& _cb;
};
template<template <class> class PRODUCER, class CONSUMER>
class SingleThread
{
public:
SingleThread() : _prod(*this){}
void processMessage(const char* message, int len)
{
// Code omitted
}
PRODUCER<SingleThread> _prod;
CONSUMER _cons;
};
关于回调中生产者和消费者之间的 C++ 循环模板依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66638433/