考虑写出一个不抛出异常的swap函数
假设Widget和WidgetImpl都是class:
class WidgetImpl{ //针对Widget数据而设计的class
public:
...
private:
int a,b,c; //可能很多数据
std::vector<double>v; //意味复制时间很长
};
当Widget被置换时真正该做的是置换内部指针,可以将std::swap针对Widget特化。
class Wigdet{ //这个class使用pimpl手法
public:
Widget(const Widget& rhs);
void swap(Widget& other){
using std::swap;
swap(pImpl,other.pImpl);
}
private:
WidgetImpl* pImpl; //指针,所含对象内含WIdget数据
};
namespace std{
template<>
void swap<Widget>(Widget& a,Widget& b){
a.swap(b);
}
}
这种做法与stl容器有一致性。
假设Widget和WidgetImpl都是class template:
template<typename T> class WidgetImpl{...};
template<typename T>class Widget{...};
namespace std{
template<typename T>
void swap<Widget<T>>(Widget<T>& a,Widget<T>& b){
a.swap(b);
}
}
此不合法,企图偏特化一个function template,c++只允许对class template偏特化。也不允许添加新的template到std里头。
改进:
namespace WidgetStuff{
...
template<typename T>
class Widget{}; //同前,内含swap成员函数
...
template<typename T>
void swap(Widget<T>& a,Widget<T>& b){
a.swap(b);
}
}
template<typename T>
void doSomething(T& obj1,T& obj2){
using std::swap; //令std::swap在此函数可用
...
swap(obj1,obj2); //为T型对象调用最佳swap版本
...
}