c++ - 插入队列模式的模式

标签 c++ stl

我必须处理 InternalMessage 类型的单个对象,将每个对象转换为一定数量的 ExternalMessage 对象(InternalMessages 和 ExternalMessages 之间存在一对多关系), 并将这些 ExternalMessage 对象放入队列中进行处理。我想有两种插入此队列的模式 - 批处理,其中所有 ExternalMessage 都以原子方式插入队列,以及正常插入,其中插入 ExternalMessage 对象在创建时放入队列。请注意,有多个线程为此队列生成消息。

我想解决这个问题是有一个 Inserter 对象,它处理插入:

class Inserter {
public:
    void ProcessMessage(const ExternalMessage& externalMessage) = 0;
};

class SingleInserter {
public:
    SingleInserter(Queue* q) : m_q(q) { }
    void ProcessMessage(const ExternalMessage& externalMessage) {
        m_q->Insert(q);
    }
private:
    Queue* m_q;
};

class BatchInserter {
public:
    BatchInserter(Queue* q) : m_q(q) { }
    void ProcessMessage(const ExternalMessage& externalMessage) {
        m_cache.Insert(externalMessage);
    }
    ~BatchInserter() {
        m_q->BatchInsert(m_cache);
    }

private:
    Queue* m_q;
    List<ExternalMessages> m_cache;
};

然后在创建消息时将 Inserter 传递到调用堆栈中。

BatchInserter ins;

SingleInserter ins;

然后

HandleMessage(someInternalMessage, ins);

HandleMessage 会做:

void HandleMessage(const InternalMessage& msg, Inserter& ins) {
    //... do logic, eventually create a externalMsg (note - this could be further down
    //the call stack, in a loop, etc. Multiple external messages could be created each
    //call to HandleMessage)
    ins.ProcessMessage(externalMsg);
}

这个设计理想吗?它允许不同的插入类型,这很好,但是是否有某种方法可以做到这一点而不必将对象向下传递到调用堆栈(例如,通过模板特化)?其次,我在实现它时是否应该遵循 STL 模式?

最佳答案

我觉得还行。我能想到的唯一改变是制作HandleMessage一个模板。所以你会有template <class T> HandleMessage(const InternalMessage& msg, T& inserter) .这样你就不会强制这个类的用户从抽象基类派生 Inserter并且会避免由于虚函数动态调度带来的小开销。

关于c++ - 插入队列模式的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10577334/

相关文章:

c++ - 即使调用超出静态变量的范围,如何在lambda的主体中直接使用静态变量

c++ - 如何使用 Polygon_mesh_slicer 的输出来控制 Surface_mesh_deformation CGAL 中的点?

c++ - 避免使用 vector 的 vector 进行复制

c++ - 从另一个线程调用 std 容器的大小是否安全?

c++ - 无法解析方法 'shrink_to_fit'

c++ - 将模板化状态的 vector 传递给构造函数时出现问题

c++ - 添加到 std::map 时获取迭代器?

c++ - 如何在 Qt Creator 中设置 “set a breakpoint in malloc_error_break to debug”?

c++ - 重载运算符 () vs 成员函数 get()

c++ - 如何在 C++ 中从另一个派生类?