2

重複の可能性:
クラスにスワップ機能を提供するにはどうすればよいですか?

同様の質問 (例: std::swap() をオーバーロードする方法) がここで尋ねられましたが、まだ決定的な答えはありません。

swap()さまざまな情報源から、カスタム型を拡張する (さまざまな人による) 推奨される 2 つの方法を知っています。

  • 同じ名前空間に無料の関数を記述し、ADLで検索します。
  • あなたのタイプに特化しstd::swap()たテンプレート。

最初の方法はもう少しエレガントに見えますが、克服する方法がわからない問題があります。

template <typename type>
struct my_type
{
  type  field;
  void swap (my_type& that)
  {
    std::swap (this->field, that.field);  // what to do to use ADL?
  }
};

上記のスニペットにmy_typeは、swap()stdlib コンテナーと同様のメンバーがあります。これは無料の機能の代わりではないことに注意してください。ここで、問題はコメント行にあり、2 つfieldの s が入れ替わっています。何でもかまいませんので、一般的なバリアントではなく、そのためにカスタマイズされたtypeものを使用したいと思います。ただし、ADL を使用できない (ように思われる) のは、を削除すると、コンパイラは常に、明らかに適切ではないメンバー関数を選択するためです。そこを離れると、ADL に依存するカスタマイズはバイパスされますが、特殊化は引き続き使用できます。swap()typestd::typestd::swap()std::swap()

swap()上記のユースケースは、アルゴリズムのすべての ADL カスタマイズを打ち負かしませんか? または、メンバーswap()を持つクラス内でADL ルックアップを使用することはまだ可能ですか?swap()

4

0 に答える 0