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