Effective C + + Item 25 는 이상 한 swap 함 수 를 쓰 는 것 을 고려 합 니 다.

2589 단어
본 고 는 senlie 오리지널 입 니 다. 이 주 소 를 유지 하 십시오.http://blog.csdn.net/zhengsenlie
경험 치: std: swap 가 당신 의 유형 효율 이 높 지 않 을 때 swap 구성원 함 수 를 제공 하고 이 함수 가 이상 한 예 시 를 던 지지 않 는 지 확인 합 니 다.
stl 의 swap 알고리즘
namespace std{
	template<typename T>
	void swap(T &a, T &b){
		T temp(a);
		a = b;
		b = temp;
	}
}


//“pimpl  ”(pointer to implementation) -->          
class WidgetImpl{
public:
	//...
private:
	int a, b, c;
	std::vector<double> v;
	//...
}


class Widget{
public:
	Widget(const Widget &rhs);
	Widget &operator=(const Widget &rhs){ //         ?-->       ,  Item10 operator=    reference to *this。
										  //   Item28   ,         handler          。
		//...
		*pImpl = *(rhs.pImpl);
		//...
	}
	//...
private:
	WidgetImpl *pImpl;
}

해석: 두 개의 Widget 대상 값 을 바 꾸 려 면 우리 가 유일 하 게 해 야 할 일 은 pImpl 지침 을 바 꾸 는 것 이지 만 부족 한 swap 알고리즘 은 이 점 을 모 릅 니 다.그것 은 세 개의 Widgets 만 복사 하 는 것 이 아니 라 세 개의 WidgetImpl 대상 도 복사 합 니 다.
시정: std:: swap 를 Widget 에 특 화
일반적으로 std 네 임 스페이스 를 바 꾸 는 것 은 허용 되 지 않 지만 표준 template 에 특 화 된 버 전 을 만 들 수 있 습 니 다.
namespace std{ //  std::swap  “T Widget”     。         
	template<>
	void swap<Widget>(Widget &a, Widget &b){
		swap(a.pImpl, b.pImpl);
	}
}

경험 치: member swap 를 제공 하면 non - member swap 를 제공 하여 전 자 를 호출 해 야 합 니 다.classes (templates 가 아 닌) 에 대해 서도 std:: swap 를 특 화 하 십시오.
예시:
namespace WidgetStuff{
	class Widget{  //     ,  STL      。    STL       public swap     std::swap    
	public:
		//...
		void swap(Widget &other){ //  swap    std::swap  using   ,    swap      “        ”
			using std::swap; 
			swap(pImpl, other.pImpl);
		}
		
		//...
	};
	void swap(Widget &a, Widget &b){ //non-member swap   ;      std    
		a.swap(b);
	}
}
namespace std{
	template<>
	void swap<Widget>(Widget &a, Widget &b){
		a.swap(b);
	}
}

경험 치: "사용자 정의 형식" 을 위해 std templates 를 모두 특 화 하 는 것 이 좋 지만 std 에 새로운 것 을 추가 하려 고 하지 마 십시오.
예시:
template<typename T>
class WidgetImpl{
	//...
}
template<typename T>
class Widget{
	//...
}


namespace std{ //  ,    --> function template     ,     
	template<typename T>
	void swap<Widget<T> >(Widget<T> &a, Widget<T> &b){
		a.swap(b);
	}
}


namespace std{
	template<typename T> //std::swap       ,    --> std        templates
	void swap(Widget<T> &a, Widget<T> &b){
		a.swap(b);
	}
}

좋은 웹페이지 즐겨찾기