Возможный дубликат:
как обеспечить функцию свопинга для моего класса?
Аналогичные вопросы (например, как перегружать 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()
членом?