1,default swap
namespace std { template<typename T> void swap( T& a, T& b) { T temp(a); a = b; b=temp; } }
只要类型T支持copying,默认的swap实现代码就会帮你置换类型为T的对象,你不需要为此另外再做任何工作。
2,std::swap
class Widget //于前面一样,唯一的差别是增加了Swap函数 { public: ... void swap(Widget& other) { using std::swap; //很有必要 swap(pImpl, other.pImpl); //若要置换Widgets就要置换其批Impl指针。 } ... }; namespace std { template<> //修订后的std::swap特化版本 void swap<Widget>(Widget& a,Widget& b) { a.swap(b); } }
与STL容器还有一致性,多有的STL容器都提供有public swap成员函数和std::swap特化版本(用以调用前者)。
3,non-member swap
namespace WidgetStuff { ... template<typename T. class Widget {...}; ... template<typename T> //non_mamber swap函数 void swap(Widget<T>& a, Widget<T>& b) //这里并不属于std命名空间 { a.swap(b); } }
对class和class template都可以用。