如何使用`Function Call Operator`将`rvalue`类型加载到我的对象?

时间:2015-10-15 06:39:31

标签: c++ operator-overloading move rvalue function-call-operator

我有一个这样的课程:

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 个答案:

答案 0 :(得分:1)

首先,您无法根据返回类型进行重载。但是,这不是您的问题,因为您不需要额外的下标运算符重载。

为了避免不必要的副本,并且class Element个对象可以移动,您可以使用std::swap代替直接分配。

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

由于C ++ 11 std::swap避免了不必要的拷贝,因为它使用了移动语义。