我有一个这样的课程:
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.
我该怎么做?
答案 0 :(得分:1)
首先,您无法根据返回类型进行重载。但是,这不是您的问题,因为您不需要额外的下标运算符重载。
为了避免不必要的副本,并且class Element
个对象可以移动,您可以使用std::swap
代替直接分配。
std::swap(myclass(2, 3), element);
由于C ++ 11 std::swap
避免了不必要的拷贝,因为它使用了移动语义。