我有这门课:
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?
您可以拥有一个带有默认移动运算符的基类:
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;
};