2017-01-19 1 views
1

Derived에서 비공개 된 Base 유형이 있습니다. Derived은 새 멤버 변수를 추가하지 않습니다.개인 상속 및 ADL 스왑

Derived에 대한 스왑을 작성하는 올바른 방법은 무엇입니까? 우리는 Base 구성원 swap을 가지고 가정 할 수 없다, 그래서 나는 아마 생각 :

class Derived : private Base { 
public: 
    void swap(Derived& other) noexcept 
    { 
     using std::swap; 
     swap(static_cast<Base&>(*this), static_cast<Base&>(other)); 
    } 
}; 

가 올바르게 작동합니까?

답변

1

올바르게 작동합니까?

d1.swap(d2)으로 예, 그렇습니다.

그러나 사용자가 쓰려고하는 경우 : 그 존재하고 특별한 무언가를 일이 있다면, swap(Base&, Base&)를 호출하지 않습니다

using std::swap; 
swap(d1, d2); 

. std::swap<Derived>을 호출하고 이동 생성자/할당을 사용합니다.

그래서, 추가로 Derived의 선언 내에서 쓰기 :

friend void swap(Derived& d1, Derived& d2) { 
    d1.swap(d2); 
} 

또는 한 것을 쓰기 : 그것은 잘못되고 있기 때문에

friend void swap(Derived& d1, Derived& d2) { 
    using std::swap; 
    swap(static_cast<Base&>(d1), static_cast<Base&>(d2)); 
} 
+0

이 아 그래, 내가 Derived''의 ADL 스왑을 왼쪽 직접 질문과 관련이 없습니다. 하지만 지적 해 주셔서 감사합니다. –