可能重复:
如何为我的班级提供交换功能?
类似的问题(例如如何重载 std::swap())已经被问到这里,但我仍然没有看到一个决定性的答案。
从各种来源,我知道两种推荐的(由不同的人)扩展swap()
自定义类型的方法:
- 在同一命名空间中编写一个自由函数并让ADL查找它;
- 为您的类型专门
std::swap()
模板。
第一种方法看起来更优雅一些,但是它有一个问题我不知道如何克服:
template <typename type>
struct my_type
{
type field;
void swap (my_type& that)
{
std::swap (this->field, that.field); // what to do to use ADL?
}
};
在上面的代码片段my_type
中有一个swap()
成员,类似于 stdlib 容器;请注意,它不是免费功能的替代品,假设我只想拥有它。现在,问题出在注释行上,交换了两个field
s。由于type
可以是任何东西,我想使用swap()
定制的type
,而不是通用的变体。但是,我不能(似乎)使用 ADL,因为如果我删除std::
,编译器总是选择显然不适合type
. 如果我离开std::
那里,任何swap()
依赖 ADL 的自定义都将被绕过,而std::swap()
仍然可以使用的专业化。
上面的用例不会破坏swap()
算法的所有 ADL 定制吗?或者仍然可以swap()
在有swap()
成员的类中使用 ADL 查找?