swap() для пользовательского типа в C++: использовать ADL или шаблонную специализацию?

Возможный дубликат:
Как обеспечить функцию подкачки для моего класса?

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

Разве приведенный выше сценарий не победит все настройки ADL swap() алгоритм? Или все еще возможно использовать поиск ADL для swap() внутри класса с swap() член?

0 ответов

Другие вопросы по тегам