1. std::swap이 해당 타입에 대해 느리게 동작할 여지가 있다면, swap 멤버함수를 제공하자. 단 이때 예외를 던지지 않아야한다.
2. swap 안에 클래스 템플릿이 들어가야 하는 경우, 현재 클래스 혹은 템플릿이 들어있는 네임스페이스와 같은 네임스페이스에 비멤버 swap을 만들어 넣는다. 그리고 1번에서 만든 swap함수를 이 비멤버함수가 호출하도록 한다.
namespace WidgetStuff {
...
template<typename T>
class Widget { ... };
...
template<typename T>
void swap(Widget<T>& a, Widget<T>& b)
{
a.swap(b);
}
}
3. 새로운 클래스(클래스 템플릿이 아니라)를 만들고 있다면 그 클래스에 대한 std::swap의 특수화 버전을 준비해둔다. 그리고 이 함수 안에서 swap 멤버함수를 호출하도록 한다.
namespace std {
template<>
void swap<Widget> (widget& a, Widget& b){
swap(a.pImpl, b.pImpl);
}
}
이런 두가지 함수를 만든 경우, 다음과 같이 멤버함수 swap 안에서 using std::swap를 반드시 선언해주고, std::swap(a.pImpl, b.pImpl) 과 같이 std한정자를 붙여서 호출하지 않도록 한다. swap만을 호출해서 컴파일러가 해당 타입에 맞는 함수를 호출하도록 하자.
template<typename T>
void doSomething(T& obj1, T& obj2)
{
using std::swap; //저도 봐주세요;;
...
swap(obj1, obj2);
...
}