重複の可能性:
クラスにスワップ機能を提供するにはどうすればよいですか?
同様の質問 (例: 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()
type
std::
type
std::
swap()
std::swap()
swap()
上記のユースケースは、アルゴリズムのすべての ADL カスタマイズを打ち負かしませんか? または、メンバーswap()
を持つクラス内でADL ルックアップを使用することはまだ可能ですか?swap()