Effective C + + Item 25 는 이상 한 swap 함 수 를 쓰 는 것 을 고려 합 니 다.
경험 치: 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);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.