如何使用“函数调用运算符”将“右值”类型加载到我的对象中?
How do I use the `Function Call Operator` to load `rvalue` types to my object?
我有一个 class 这样的:
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.
我该怎么做?
首先你不能基于return类型重载。但是,这不是您的问题,因为您不需要下标运算符的额外重载。
为了避免不必要的复制,并且由于 class Element
对象是可移动的,您可以使用 std::swap
而不是直接赋值。
std::swap(myclass(2, 3), element);
因为 C++11 std::swap
避免了不必要的复制,因为它使用移动语义。
我有一个 class 这样的:
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.
我该怎么做?
首先你不能基于return类型重载。但是,这不是您的问题,因为您不需要下标运算符的额外重载。
为了避免不必要的复制,并且由于 class Element
对象是可移动的,您可以使用 std::swap
而不是直接赋值。
std::swap(myclass(2, 3), element);
因为 C++11 std::swap
避免了不必要的复制,因为它使用移动语义。