gpt4 book ai didi

c++ - 委托(delegate)给默认的移动构造函数

转载 作者:IT老高 更新时间:2023-10-28 22:05:35 24 4
gpt4 key购买 nike

我经常发现自己为具有许多成员变量的类编写乏味的移动构造函数。它们如下所示:

A(A && rhs) :
a(std::move(rhs.a)),
b(std::move(rhs.b)),
c(std::move(rhs.c)),
d(std::move(rhs.d)) {
some_extra_work();
}

也就是说,它们执行与默认移动构造函数相关的所有操作,然后执行一些平凡的额外任务。理想情况下,我会委托(delegate)给默认的移动构造函数,然后执行额外的工作,但是定义我自己的移动构造函数的行为会阻止定义默认实现,这意味着没有什么可以委托(delegate)给。

有没有一种很好的方法来绕过这种反模式?

最佳答案

更新:忽略此答案的第一部分并跳到有更好解决方案的末尾。

将额外的工作包装在一个新类型中并从它继承:

class A;

struct EW
{
EW(EW&&);
};

class A : private EW
{
friend class EW;
public:
A(A&&) = default;
};

EW::EW(EW&&) { A* self = static_cast<A*>(this); self->some_extra_work(); }

您也可以使用数据成员而不是基类来执行此操作,但您需要使用 offsetof(对于非标准布局类型未定义)或手动操作使用偷偷摸摸的指针算法滚动等价物。使用继承允许您使用 static_cast 进行转换。

如果 some_extra_work() 必须在成员初始化之后完成,这将不起作用,因为基类首先被初始化。

或者,如果额外的工作实际上是在您要从中移动的右值对象上操作,那么您应该将成员包装在移动时自动执行该工作的类型中,例如我的 tidy_ptr类型,我用来实现 Rule of Zero

class A
{
tidy_ptr<D> d;
public:
A() = default;
A(const A&) = default;
A(A&& r) = default; // Postcondition: r.d == nullptr
};

关于c++ - 委托(delegate)给默认的移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com