С++ 11 "move" - хорошая функция, но мне было сложно избежать дублирования кода (мы все ненавидим это) при одновременном использовании с "копией". Следующий код - это моя реализация простой круглой очереди (неполной), два метода push() почти одинаковы, кроме одной строки.
Я столкнулся со многими подобными ситуациями вроде этого. Любые идеи, как избежать такого дублирования кода без использования макроса?
=== РЕДАКТИРОВАТЬ ===
В этом конкретном примере дублированный код может быть реорганизован и помещен в отдельную функцию, но иногда такой рефакторинг недоступен или не может быть легко реализован.
#include <cstdlib>
#include <utility>
template<typename T>
class CircularQueue {
public:
CircularQueue(long size = 32) : size{size} {
buffer = std::malloc(sizeof(T) * size);
}
~CircularQueue();
bool full() const {
return counter.in - counter.out >= size;
}
bool empty() const {
return counter.in == counter.out;
}
void push(T&& data) {
if (full()) {
throw Invalid{};
}
long offset = counter.in % size;
new (buffer + offset) T{std::forward<T>(data)};
++counter.in;
}
void push(const T& data) {
if (full()) {
throw Invalid{};
}
long offset = counter.in % size;
new (buffer + offset) T{data};
++counter.in;
}
private:
T* buffer;
long size;
struct {
long in, out;
} counter;
};