Как я могу использовать `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.

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам