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

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