如何为我的模板类添加std :: swap?

orl*_*rlp 5 c++ swap stl class

可能重复:
如何为我的班级提供交换功能?

关于这一点存在一些问题,但是很多矛盾(A人给出了解决方案A',其中有很多人用B表示它是UB)或者"仅在编译器支持ADL时才有效".

所以,假设我有以下模板(容器)类:

template<typename T>
class C {
    // ...
    void swap(C<T>& y) throw(); // C x; x.swap(y);
}
Run Code Online (Sandbox Code Playgroud)

那么确保这个(示例)代码有效的正确方法是什么:

C<int> x, y;
std::swap(x, y);
Run Code Online (Sandbox Code Playgroud)

请给出你对C++ 03的答案,如果它仍然适用于C++ 0x,那就更好了!

Mac*_*cke 6

不允许在std-namespace中重载函数.

将swap声明为自由函数,在与类相同的命名空间中重载C:

 template<class T>
 void swap(C<T>& x, C<T>& y) { x.swap(y); }
Run Code Online (Sandbox Code Playgroud)

正确的交换方式是导入std :: swap并使用非限定版本(通过基于命名空间的Koenig查找返回):

 template<class T>
 void dostuff(T x, T y) {
    ...
    using std::swap;
    swap(x,y);
    ...
 }
Run Code Online (Sandbox Code Playgroud)

如果x并且是C,则将使用C :: swap,对于没有自己的交换的类型,将使用std :: swap.

(像上面这样的std :: swap的导入仅在模型函数中是必需的,其中类型是未知的.如果你知道你有一个C,那么你可以立即使用x.swap(y)没有问题.)