我有一个Base
类型,由Derived
私下继承。 Derived
不会添加任何新的成员变量。
现在为Derived
编写交换的正确方法是什么?我们不能假设Base
有成员swap
,所以我想或许:
class Derived : private Base {
public:
void swap(Derived& other) noexcept
{
using std::swap;
swap(static_cast<Base&>(*this), static_cast<Base&>(other));
}
};
这是否正常?
答案 0 :(得分:1)
这是否正常?
通过电话d1.swap(d2)
,是的。
但如果用户试图写:
using std::swap;
swap(d1, d2);
这不会调用swap(Base&, Base&)
,如果这是一个存在的东西,并做了一些特别的事情。它将调用std::swap<Derived>
并使用移动构造函数/赋值。
所以,另外写一下Derived
:
friend void swap(Derived& d1, Derived& d2) {
d1.swap(d2);
}
或者只写那一个:
friend void swap(Derived& d1, Derived& d2) {
using std::swap;
swap(static_cast<Base&>(d1), static_cast<Base&>(d2));
}