namespace std { template<typename T> void swap( T& a , T& b) { T temp(a); a = b; b = temp } }①内置类型的调用
int a = 2; int b =3; std::swap(a, b); cout<<"a:"<<a<<" b:"<<b<<endl;②非内置类型的调用
class WigetImpl { public: WigetImpl(const int v) : m_value(v){ } int GetValue() const {return m_value;} private: int m_value; }; class Wiget { public: Wiget(const int v) {m_impl = new WigetImpl(v);} ~Wiget() {if (m_impl != NULL) delete m_impl; m_impl = NULL;} Wiget(const Wiget &wiget) { this->m_impl = new WigetImpl(wiget.m_impl->GetValue()); } Wiget& operator = (const Wiget &wiget) { if (this != &wiget) { //采用copy-and-swap技术会更好,参考前面条款 *m_impl = *wiget.m_impl; } return *this; } private: WigetImpl *m_impl; };调用
Wiget w1(2); Wiget w2(3); std::swap(w1, w2);调用缺省的swap,不但需要调用三次Wiget的copy函数,还调用三次WigetImpl的copy函数,效率非常低。
namespace std { template<> void swap<Wiget>(Wiget &a,Wiget &b) { a.swap(b); //调用Wiget的swap函数 } }在Wiget中定义一个swap函数,实现对m_impl指针交换
void swap(Wiget & rhl) { std::swap(this->m_impl, rhl.m_impl); }这样调用只是调用三次WigetImpl的copy函数。
template<typename T> class WigetImpl {}; template<typename T> class Wiget{};我们对函数进行偏特化
namespace std { template<typename T> void swap<Wiget<T> >(Wiget<T> &lhs, Wiget<T> &rhs) { lhs.swap(rhs); } }但C++只对类偏特化,函数会报错,如:“std::swap”: 非法使用显式模板参数
namespace std { template<typename T> void swap(Wiget<T> &lhs, Wiget<T> &rhs) { lhs.swap(rhs); } }但std是个特殊的命名空间,可以全特化std内的template,但不能添加新的template到std。
template<typename T> void swap(Wiget<T> &lhs, Wiget<T> &rhs) { lhs.swap(rhs); //调用Wiget的swap函数 }上面介绍了3中swap:
template<typename T> void CallSwap(T &obj1, T &obj2) { <span style="white-space:pre"> </span>using std::swap; <span style="white-space:pre"> </span>swap(obj1, obj2); }相关的原理,可以查看C++名称查找法则
template<typename T> class WigetImpl { public: WigetImpl(const T v) : m_value(v){ } T GetValue() const {return m_value;} private: T m_value; }; template<typename T> class Wiget { public: Wiget(const T v) {m_impl = new WigetImpl<T>(v);} ~Wiget() {if (m_impl != NULL) delete m_impl; m_impl = NULL;} Wiget(const Wiget &wiget) { this->m_impl = new WigetImpl<T>(wiget.m_impl->GetValue()); } Wiget& operator = (const Wiget &wiget) { if (this != &wiget) { //采用copy-and-swap技术会更好,参考前面条款 *m_impl = *wiget.m_impl; } return *this; } void swap(Wiget & rhl) { std::swap(this->m_impl, rhl.m_impl); } private: WigetImpl<T> *m_impl; }; namespace std { template<> void swap<Wiget<int> >(Wiget<int> &a,Wiget<int> &b) { a.swap(b); //调用Wiget的swap函数 } } template<typename T> void swap(Wiget<T> &lhs, Wiget<T> &rhs) { lhs.swap(rhs); } template<typename T> void CallSwap(T &obj1, T &obj2) { using std::swap; swap(obj1, obj2); }
条款25:考虑写出一个不抛异常的swap函数,布布扣,bubuko.com
原文地址:http://blog.csdn.net/hualicuan/article/details/27859713