代码之家  ›  专栏  ›  技术社区  ›  Zebrafish

有没有办法从非默认操作符调用默认的move操作符?

  •  0
  • Zebrafish  · 技术社区  · 2 年前

    我有这样的课:

    struct Handle
    {
        int* ptr_to_something;
        void operator=(Handle&& other)
        {
            ptr_to_something = other.ptr_to_something;
            this->member1 = other.member1;
            this->member2 = other.member2;
            this->member3 = other.member3;
            
            other.ptr_to_something = nullptr;
            
        }
        
        int member1;
        int member2;
        int member3;
    };
    

    我讨厌的是可能会添加新成员,我必须记住将他们添加到运算符中。有没有一种方法可以调用默认运算符,然后添加一点点,但在它之后将另一个ptr设置为null?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Artyer    2 年前

    您可以有一个带有默认移动运算符的基类:

    struct HandlerBase {
        int* ptr_to_something;
        int member1;
        int member2;
        int member3;
    };
    
    struct Handler : HandlerBase {
        void operator=(Handler&& other) {
            HandlerBase::operator=(std::move(other));
            other.ptr_to_something = nullptr;
        }
    };
    

    或者,您可以通过使默认的移动操作符执行您想要的操作 ptr_to_something 一个班级 operator= 执行您想要的操作:

    template<typename T>
    struct PtrThatResetsOnMove {
        T* value;
    
        constexpr explicit(false) PtrThatResetsOnMove(T* value) noexcept : value(value) {}
        constexpr PtrThatResetsOnMove(PtrThatResetsOnMove&& other) noexcept : value(std::exchange(other.value, nullptr)) {}
        constexpr PtrThatResetsOnMove& operator=(PtrThatResetsOnMove&& other) noexcept {
            value = std::exchange(other.value, nullptr);
            return *this;
        }
        ~PtrThatResetsOnMove() = default;
    };
    
    struct Handler {
        PtrThatResetsOnMove<int> ptr_to_something;
        int member1;
        int member2;
        int member3;
    };
    

    或者,您可以使用默认运算符将其他成员放在不同的类中:

    struct HandlerMembers {
        int member1;
        int member2;
        int member3;
    };
    
    struct Handler {
        int* ptr_to_something;
        HandlerMembers members;
        void operator=(Handler&& other) {
           ptr_to_something = other.ptr_to_something;
           members = std::move(other.members);
           other.ptr_to_something = nullptr;
        }
    };