此处已提出类似问题(例如How to overload std::swap()),但我仍然没有看到确凿的答案。
从各种来源我知道两种推荐(由不同的人)扩展swap()
自定义类型的方法:
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查找?