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



可能重复:
如何为我的类提供交换函数?

关于这一点有一些问题,但有很多矛盾(a给出了解决方案a',许多人投了赞成票,B说它是UB)或"只有当编译器支持ADL时才有效"得到了回答。

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

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

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

C<int> x, y;
std::swap(x, y);

请给出你对C++03的答案,如果它在C++0x中仍然有效,那就更好了!

不允许在std命名空间中重载函数

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

 template<class T>
 void swap(C<T>& x, C<T>& y) { x.swap(y); }

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

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

如果x和是C,则使用C::swap,对于没有自己交换的类型,使用std::swap。

(只有在类型未知的模板函数中才需要导入如上所述的std::swap。如果你知道你有一个C,那么你可以立即使用x.swap(y),没有问题。)

最新更新