0

我有这样的课:

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.

我怎样才能做到这一点?

4

1 回答 1

1

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

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

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

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

于 2015-10-15T06:49:30.827 回答