У меня есть такой класс:
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.
Как я могу это сделать?
Прежде всего, вы не можете перегрузить в зависимости от типа возвращаемого значения. Однако это не ваша проблема, так как вам не нужны дополнительные перегрузки оператора индекса.
Во избежание ненужных копий и class Element
объекты являются подвижными, вы можете использовать std::swap
вместо прямого назначения.
std::swap(myclass(2, 3), element);
Начиная с C ++ 11 std::swap
избегает ненужной копии, потому что она использует семантику перемещения.
Других решений пока нет …