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