Possible Duplicate:
how to provide a swap function for my class?
每次我认为我理解它时,我都会看到一些让我非常困惑的东西。
如果你想为自己的类提供 swap
的实现,你会怎么做?
可能性列表是:
Define one inside the
std
namespace (taking two arguments) ,它调用下面的#3
(有人说这是正确的;有人说这是非法的)在类内部定义一个静态方法,带两个参数进行交换
(对我来说比 #4 更有意义,但我不明白为什么没有人这样做),它根据需要调用任何基类swap
sDefine an instance method inside the class, taking one other argument to swap with ,它根据需要调用任何基类
swap
sDefine an instance method inside the class, taking two other arguments to swap , 还有 here ,它根据需要调用任何基类
swap
sDefine one in your own namespace (taking two arguments) , 调用 #3
别的东西
我自己的理解是我需要 #5 和 #3,然后调用者将调用 swap
就像 using std::swap; swap(a, b);
,但似乎没有人建议这种组合的事实让我很困惑。我真的完全不明白#4,因为每个人似乎都在使用 instance 成员,而实际上操作是静态的。我不知道是我的理解是错误的,还是我在查找时看到的一堆答案。
正确的方法是什么?
最佳答案
根据您自己的理解,我看到的一个常见模式是提供 3 和 5。
- 为
std::
添加一个特化命名空间,这是允许的,但可能并非在所有情况下都可行(如果您的类型本身就是模板)。 - 根本没有提供任何优势,并且当在成员之一之外使用时强制使用该类型,这意味着要实现
swap
在将您的类型作为成员的其他类型上,他们需要对调用进行限定(void swap( other& l, other& r ) { T::swap( l.t, r.t ); }
) - 不需要友元,允许与
rvalue
一起使用s(甚至在 C++03 中)并且在某些情况下是惯用的std::vector<int>().swap( v );
清除 vector 的内容。 - 什么?你误解了代码!这不是声明一个接受两个参数的成员,而是一个接受两个参数的自由函数,并内联定义函数。这相当于 5(不转发到 3,而是在 free 函数中实现所有内容)。
- 同一命名空间中的自由函数允许 ADL 找到它,并允许其他代码使用
void swap( other& l, other& r ) { using std::swap; swap( l.t, r.t ); }
的通用模式无需知道other::t
的类型是否有一个特定的swap
过载或std::
中的一个需要使用。转发到 3 允许您提供可通过 ADL 以及临时对象使用的单个(实际)实现。
关于c++ - 如何实现swap()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635172/