为用户定义的类型重载全局交换

Cha*_*l72 12 c++ standards swap stl

C++标准禁止在命名空间中声明类型或定义任何内容std,但它允许您为用户定义的类型专门化标准STL模板.

通常,当我想专注std::swap于我自己的自定义模板类型时,我只是这样做:

namespace std
{
  template <class T>
  void swap(MyType<T>& t1, MyType<T>& t2)
  {
     t1.swap(t2);
  }
}
Run Code Online (Sandbox Code Playgroud)

......这很好.但我不完全确定我的惯常做法是否符合标准.我这样做了吗?

小智 15

你所拥有的不是专业化,它是超载,正是标准禁止的.(但是,它几乎总是在实践中起作用,并且可能是您可以接受的.)

以下是为类模板提供自己的交换的方法:

template<class T>
struct Ex {
  friend void swap(Ex& a, Ex& b) {
    using std::swap;
    swap(a.n, b.n);
  }
  T n;
}
Run Code Online (Sandbox Code Playgroud)

以下是你如何调用swap,你会注意到它也用于Ex的交换:

void f() {
  using std::swap; // std::swap is the default or fallback
  Ex<int> a, b;
  swap(a, b); // invokes ADL
}
Run Code Online (Sandbox Code Playgroud)

相关:功能模板专业化的重要性和必要性