如何避免大多数成员函数相同的代码重复?

时间:2019-10-29 21:21:04

标签: c++ templates code-duplication

我已经实现了Michael和Scott队列(并发无锁队列),并且出队操作代码重复存在问题。 通常,这个问题不是关于队列算法本身的,而是关于如何干净地实现函数的几种变体的 大多数具有相同的结构。 我说的例子:

bool dequeue() {
    while(true) {
        // [atomically load head, tail and head->next]
        auto head = m_head.load(std::memory_order_acquire);
        auto head_ptr = head.get();
        auto tail = m_tail.load(std::memory_order_acquire);
        auto next = head_ptr->next.load(std::memory_order_acquire);
        auto next_ptr = next.get();
        // Are head, tail, and next consistent?
        if(head == m_head.load(std::memory_order_acquire)) {
            // Is queue empty or tail falling behind?
            if(head_ptr == tail.get()) {
                // Is queue empty?
                if(!next_ptr) {
                    return false;
                }
                // tail is falling behind. Try to advance it
                m_tail.compare_exchange_strong(tail, tail(next_ptr));
            } else if(next_ptr){
                // [ above check is result free list interaction, not part of orginal algo ]
                // [Read value from next_ptr->data]
                // <<<variant of operation here>>>>
            }
        }
    }
}

我计划实施各种操作来代替<<<variant of operation here>>>> 包括逻辑,if-else代码退出循环等,我想避免重复主代码 该函数的主体。我应该如何进行?我至少使用C ++ 14标准。 背景故事是boost :: lockfree :: queue <>太受限制, 我想实施pop_if()compare_front()begin()之类的操作 除了<<<variant operation here>>>部分以外,它们共享相同的基本出队操作代码逻辑。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,则可以创建带有参数的泛型方法-函子

template <class Func>
bool dequeue_generic(Func func) {

....

func(next_ptr->data)

}

然后使用不同的函子的实现方法来处理数据。