Как я могу использовать `Function Call Operator` для загрузки типов` rvalue` в мой объект?

У меня есть такой класс:

template<typename T>
class MyClass
{
public:
// ...
T && operator()(uint64_t i, uint64_t j);  // I want to add a member function like this.
T &  operator()(uint64_t i, uint64_t j);
const T &  operator()(uint64_t i, uint64_t j) const;
// ...
};

Пока я пересматривал код, я понял, что хранимый объект типа T копируется каждый раз, когда он пытается установить объект в (i,j) позиция. Я хотел бы использовать семантику перемещения и избежать этого ненужного копирования, если это возможно? Можно ли решить эту проблему, добавив третий оператор, как в коде выше?

Моя цель — получить доступ к MyClass например, это в коде:

MyClass<Element> myclass;
// ...
Element element;                        // 'Element' is movable.
// ...
myclass(2, 3) = std::move(element);     // 'element' is no longer needed, it can be moved.

Как я могу это сделать?

0

Решение

Прежде всего, вы не можете перегрузить в зависимости от типа возвращаемого значения. Однако это не ваша проблема, так как вам не нужны дополнительные перегрузки оператора индекса.

Во избежание ненужных копий и class Element объекты являются подвижными, вы можете использовать std::swap вместо прямого назначения.

std::swap(myclass(2, 3), element);

Начиная с C ++ 11 std::swap избегает ненужной копии, потому что она использует семантику перемещения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]