1. ホーム
  2. c++

[解決済み] std::swap()をオーバーロードする方法

2022-08-07 01:37:09

質問

std::swap() は多くのstdコンテナで使われています(例えば std::liststd::vector を含む)をソートし、さらに割り当てます。

しかし、std の実装では swap() は非常に一般化されており、カスタムタイプにはむしろ非効率的です。

従って、効率は、オーバーロードされた std::swap() をカスタム型固有の実装でオーバーロードすることで効率を上げることができます。しかし、どのように実装すれば、標準コンテナで使用されるようになるのでしょうか?

どのように解決するのですか?

正しいオーバーロードの方法 std::swap の実装をオーバーロードする (つまり特殊化する) 正しい方法は、スワップするものと同じ名前空間にそれを書くことで、それが 引数依存ルックアップ (ADL) . 特に簡単にできることとしては

class X
{
    // ...
    friend void swap(X& a, X& b)
    {
        using std::swap; // bring in swap for built-in types

        swap(a.base1, b.base1);
        swap(a.base2, b.base2);
        // ...
        swap(a.member1, b.member1);
        swap(a.member2, b.member2);
        // ...
    }
};