Ежедневный бит (е) 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.