有没有办法从非默认移动操作符调用默认移动操作符?

问题描述 投票:0回答:1

我有这门课:

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?

c++ move
1个回答
0
投票

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

struct HandlerBase {
    int* ptr_to_something;
    int member1;
    int member2;
    int member3;
};

struct Handler : HandlerBase {
    void operator=(Handle&& 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;
};
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.