私有继承和 ADL 交换
Private inheritance and ADL swap
我有一个类型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));
}
};
这工作正常吗?
这工作正常吗?
随着通话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));
}
相关文章:
- C++嵌套if语句,基本货币交换
- 有没有可能有一个只有ADL才能找到的非好友功能
- shell排序中的交换和比较
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 通过交换元素使数组相同
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 交换运算符 + 重载会导致无限递归
- 为什么 std::reduce 需要交换性?
- 函数中的 c++ using 语句,后跟函数名称(对于 ADL?
- 复制和交换习惯用法与移动操作之间的交互
- C++ - 没有自定义交换功能的移动分配运算符?
- 如何在数组中交换最小和最大的位置?
- 尽管一切看起来都很好,但值不会交换
- C++交换来自同一类成员的参数值,处理多个类
- 插入排序的最小交换
- C++在 2 个向量向量之间交换向量
- 转置矩阵:交换元素不会更改值
- 匿名命名空间中类的 ADL
- 不正确的比较和交换计数器输出用于快速排序功能
- 私有继承和 ADL 交换