在C ++中使用自定义类型的swap():使用ADL或模板专门化?

时间:2011-06-19 12:53:26

标签: c++ swap argument-dependent-lookup

  

可能重复:
  how to provide a swap function for my class?

此处已提出类似问题(例如How to overload 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。由于type可以是任何内容,因此我想使用为swap()定制的type,而不是通用变体。但是,我似乎不能(似乎)使用ADL,因为如果我删除std::,编译器总是选择成员函数,这显然不适合type。如果我将std::留在那里,则会绕过依赖于ADL的swap()的任何自定义,而仍然可以使用std::swap()的特化。

上述用例是否会破坏swap()算法的所有ADL自定义?或者是否仍然可以在swap()成员的类中使用swap()的ADL查找?

0 个答案:

没有答案