Ежедневный бит (е) C++ # 62, Правильная настройка и вызов свопа

Настройка подкачки для определяемых пользователем типов и правильный вызов подкачки с запасным вариантом могут быть сложными.

Если мы не используем версию диапазона C++20, нам нужно правильно реализовать настроенную версию как дружественную функцию (сделав ее видимой только для ADL) и использовать своп по умолчанию при ее вызове (чтобы получить запасной вариант).

#include <algorithm>

namespace MyNamespace {
struct MyClass {
    // Use inline friend function to implement custom swap.
    friend void swap(MyClass&, MyClass&) { }
};

struct MyOtherClass {};
}

MyNamespace::MyClass a, b;
MyNamespace::MyOtherClass x, y;

// Fully qualified call, will always call std::swap
std::swap(a,b); // calls std::swap
std::swap(x,y); // calls std::swap

// No suitable swap for MyOtherClass.
swap(a,b); // calls MyNamespace::swap
// swap(x,y); // would not compile

// Pull std::swap as the default into local scope:
using std::swap;
swap(a,b); // calls MyNamespace::swap
swap(x,y); // calls std::swap

// C++20 std::ranges::swap which will do the correct thing:
std::ranges::swap(x,y); // default swap
std::ranges::swap(a,b); // calls MyNamespace::swap

Откройте пример в Compiler Explorer.