我如何使用“函数调用操作符”来加载“右值”类型到我的对象

How do I use the `Function Call Operator` to load `rvalue` types to my object?

本文关键字:类型 右值 我的 对象 加载 函数 调用操作符 何使用      更新时间:2023-10-16

我有一个这样的类:

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;
        // ...
};

当我修改代码时,我意识到每次它试图将对象设置为(i,j)位置时,都会复制类型为T的存储对象。我想使用移动语义,避免这种不必要的复制,如果可能的话?有可能通过像上面的代码一样添加第三个操作符来解决这个问题吗?

我的目标是像这样在代码中访问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避免了不必要的复制,因为它使用了move语义。

相关文章: