2

可能重复:
如何为我的班级提供交换功能?

类似的问题(例如如何重载 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 容器;请注意,它不是免费功能的替代品,假设我只想拥有它。现在,问题出在注释行上,交换了两个fields。由于type可以是任何东西,我想使用swap()定制的type,而不是通用的变体。但是,我不能(似乎)使用 ADL,因为如果我删除std::,编译器总是选择显然不适合type. 如果我离开std::那里,任何swap()依赖 ADL 的自定义都将被绕过,而std::swap()仍然可以使用的专业化。

上面的用例不会破坏swap()算法的所有 ADL 定制吗?或者仍然可以swap()在有swap()成员的类中使用 ADL 查找?

4

0 回答 0