详细内容请看<<Effective C++>>条款25 考虑一个不抛出异常的swap函数
#include <iostream>
using namespace std;
namespace WidgetStuff
{
template<typename T>
class WidgetImpl
{
public:
WidgetImpl(const T& a);
void print()const;
private:
T m_a;
};
template<typename T>
WidgetImpl<T>::WidgetImpl(const T& a):m_a(a)
{
}
template<typename T>
void WidgetImpl<T>::print()const
{
cout<<m_a<<endl;
}
template<typename T>
class Widget
{
public:
Widget(const T& val);
Widget(const Widget& rhs);
~Widget();
Widget& operator=(const Widget& rhs);
void swap(Widget& rhs);
void print()const;
private:
WidgetImpl<T>* m_pImpl;
};
template<typename T>
Widget<T>::Widget(const T& val):m_pImpl(new WidgetImpl<T>(val))
{
}
template<typename T>
Widget<T>::Widget(const Widget& rhs):m_pImpl(new WidgetImpl<T>(*rhs.m_pImpl))
{
}
template<typename T>
Widget<T>::~Widget()
{
}
template<typename T>
Widget<T>& Widget<T>::operator=(const Widget& rhs)
{
if(this ==&rhs)
return *this;
delete m_pImpl;
m_pImpl=new WidgetImpl<T>(*rhs.m_pImpl);
return *this;
}
template<typename T>
void Widget<T>::swap(Widget& rhs)
{
using std::swap;
swap(m_pImpl,rhs.m_pImpl);
}
template<typename T>
void Widget<T>::print()const
{
m_pImpl->print();
}
template<typename T>
void swap(Widget<T>& lhs, Widget<T>& rhs)
{
lhs.swap(rhs);
}
}
int main()
{
WidgetStuff::Widget<int>wid1(1);
WidgetStuff::Widget<int>wid2(2);
wid1.print();
wid2.print();
swap(wid1,wid2);
wid1.print();
wid2.print();
return 0;
}
#include <iostream>
using namespace std;
template<typename T>
class WidgetImpl
{
public:
WidgetImpl(const T& a);
void print()const;
private:
T m_a;
};
template<typename T>
WidgetImpl<T>::WidgetImpl(const T& a):m_a(a)
{
}
template<typename T>
void WidgetImpl<T>::print()const
{
cout<<m_a<<endl;
}
template<typename T>
class Widget
{
public:
Widget(const T& val);
Widget(const Widget& rhs);
~Widget();
Widget& operator=(const Widget& rhs);
void swap(Widget& rhs);
void print()const;
private:
WidgetImpl<T>* m_pImpl;
};
template<typename T>
Widget<T>::Widget(const T& val):m_pImpl(new WidgetImpl<T>(val))
{
}
template<typename T>
Widget<T>::Widget(const Widget& rhs):m_pImpl(new WidgetImpl<T>(*rhs.m_pImpl))
{
}
template<typename T>
Widget<T>::~Widget()
{
}
template<typename T>
Widget<T>& Widget<T>::operator=(const Widget& rhs)
{
if(this ==&rhs)
return *this;
delete m_pImpl;
m_pImpl=new WidgetImpl<T>(*rhs.m_pImpl);
return *this;
}
template<typename T>
void Widget<T>::swap(Widget& rhs)
{
using std::swap;
swap(m_pImpl,rhs.m_pImpl);
}
template<typename T>
void Widget<T>::print()const
{
m_pImpl->print();
}
template<typename T>
void swap(Widget<T>& lhs, Widget<T>& rhs)
{
lhs.swap(rhs);
}
int main()
{
Widget<int>wid1(1);
Widget<int>wid2(2);
wid1.print();
wid2.print();
swap(wid1,wid2);
wid1.print();
wid2.print();
return 0;
}