c++ - 如何实现swap()?

标签 c++ swap

Possible Duplicate:
how to provide a swap function for my class?

每次我认为我理解它时,我都会看到一些让我非常困惑的东西。

如果你想为自己的类提供 swap 的实现,你会怎么做?

可能性列表是:

  1. Define one inside the std namespace (taking two arguments) ,它调用下面的#3
    (有人说这是正确的;有人说这是非法的)

  2. 在类内部定义一个静态方法,带两个参数进行交换
    (对我来说比 #4 更有意义,但我不明白为什么没有人这样做),它根据需要调用任何基类 swaps

  3. Define an instance method inside the class, taking one other argument to swap with ,它根据需要调用任何基类 swaps

  4. Define an instance method inside the class, taking two other arguments to swap , 还有 here ,它根据需要调用任何基类 swaps

  5. Define one in your own namespace (taking two arguments) , 调用 #3

  6. 别的东西

我自己的理解是我需要 #5 和 #3,然后调用者将调用 swap 就像 using std::swap; swap(a, b);,但似乎没有人建议这种组合的事实让我很困惑。我真的完全不明白#4,因为每个人似乎都在使用 instance 成员,而实际上操作是静态的。我不知道是我的理解是错误的,还是我在查找时看到的一堆答案。

正确的方法是什么?

最佳答案

根据您自己的理解,我看到的一个常见模式是提供 3 和 5。

  1. std:: 添加一个特化命名空间,这是允许的,但可能并非在所有情况下都可行(如果您的类型本身就是模板)。
  2. 根本没有提供任何优势,并且当在成员之一之外使用时强制使用该类型,这意味着要实现 swap在将您的类型作为成员的其他类型上,他们需要对调用进行限定(void swap( other& l, other& r ) { T::swap( l.t, r.t ); })
  3. 不需要友元,允许与 rvalue 一起使用s(甚至在 C++03 中)并且在某些情况下是惯用的 std::vector<int>().swap( v );清除 vector 的内容。
  4. 什么?你误解了代码!这不是声明一个接受两个参数的成员,而是一个接受两个参数的自由函数,并内联定义函数。这相当于 5(不转发到 3,而是在 free 函数中实现所有内容)。
  5. 同一命名空间中的自由函数允许 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/

相关文章:

C++ 模板对方法的限制

c++ - 如何将 win32 应用程序迁移到 x64 应用程序?

linux - 顶部命令输出中的 Mem 和 Swap

c - 交换 32 位值字节的最快(优化)方式

c++ - 如何在不移动的情况下交换 map 元素?

c++ - 检查容器类型

c++ - 项目在 Windows 7 上运行,但无法在带有 Virtual Box 的 Linux 上运行

c++ - 使用10.4u SDK的`does not name a type`帮助(10.6.8)

C++ std::sort on std::vector<Object> - 错误太多

java - 交换数组java的两个邻域元素