函数 swap

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都可以用。

原文地址:https://www.cnblogs.com/qiushuixiaozhanshi/p/5709877.html