Возможный дубликат:
как обеспечить функцию свопинга для моего класса?
Аналогичные вопросы (например, как перегружать std:: swap()) заданы здесь, но я до сих пор не вижу окончательного ответа.
Из разных источников я знаю два рекомендуемых (разными людьми) способов расширения swap() для пользовательских типов:
- напишите свободную функцию в том же пространстве имен и 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; обратите внимание, что это не замена бесплатной функции, скажем, я просто хочу ее получить. Теперь проблема связана с прокомментированной строкой, заменяя два field s. Поскольку type может быть чем угодно, я бы хотел использовать swap() для него type, а не общий вариант. Однако я не могу (кажется) использовать ADL, потому что, если я удалю std::, компилятор всегда выбирает функцию-член, которая, очевидно, не подходит для type. И если я оставлю std:: там, любые настройки swap(), полагающиеся на ADL, будут обходить, тогда как специализации std::swap() все еще могут быть использованы.
Не будет ли вышеупомянутый usecase победить все настройки ADL алгоритма swap()? Или все еще можно использовать поиск ADL для swap() внутри класса с swap() членом?