2017-01-19 4 views
1

私はタイプですが、それは私的にDerivedから継承されています。 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); 
} 

か一つだけという書き込み:それはにISNので

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

は、ああ、はい、私はDerived' 'のためのADLスワップを残し直接質問に関連するものではありません。しかし、指摘してくれてありがとう。 –