回调中生产者和消费者之间的 C++ 循环模板依赖

标签 c++ templates

我正在设计两个封装生产者和消费者的类。一个类执行单线程处理,另一个类(此处未显示)执行两个线程。

生产者和消费者通过模板参数传递给每个“线程类”。

*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;
};

但是我有循环模板依赖的问题。 SingleThreadProducer 作为模板参数,但 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/

相关文章:

c++ - std::map 的部分反序列化

c++ - 从不同线程调用 recvfrom() 和 setsockopt() 添加/离开多播成员

c++ - pthread_cond_signal 函数是否解锁调用线程锁定的互斥锁?

c++ - TCHAR[]、LPWSTR、LPTSTR 和 GetWindow 文本函数

c++ - 编译器在模板类中实例化函数,甚至不调用它

c++ - 在模板化模板参数上专门化模板类构造函数

c++ - C++中逗号运算符的不同行为与返回?

django - 如何在handlebars-django模板中引用静态文件

c++ - template <pointer> 获取指向对象的类型

c++ - 在递归模板中通过引用传递模板函数