Как добавить std::swap для моего шаблона?
Возможный дубликат:
Как обеспечить функцию подкачки для моего класса?
Есть некоторые вопросы по этому поводу, но на множество противоречий (человек А, дающий решение А 'со многими возражениями, с человеком Б, который говорит, что это UB) или "работает, только если компилятор поддерживает ADL" ответили.
Итак, скажем, у меня есть следующий шаблон (контейнер) класс:
template<typename T>
class C {
// ...
void swap(C<T>& y) throw(); // C x; x.swap(y);
}
тогда как правильно убедиться, что этот (пример) код работает:
C<int> x, y;
std::swap(x, y);
Пожалуйста, дайте свой ответ для C++03, и если он все еще работает в C++0x, еще лучше!
1 ответ
Вы не можете перегружать функции в пространстве имен std.
Объявите swap как свободную функцию, перегруженную в том же пространстве имен, что и ваш класс C
:
template<class T>
void swap(C<T>& x, C<T>& y) { x.swap(y); }
Правильный способ поменять местами - это импортировать std:: swap и использовать неквалифицированную версию (которая получена с помощью поиска Кенига на основе пространства имен):
template<class T>
void dostuff(T x, T y) {
...
using std::swap;
swap(x,y);
...
}
Это будет использовать C::swap, если x и C, и std:: swap для типов, у которых нет собственного свопа.
(Импорт std:: swap, как описано выше, необходим только в шаблонных функциях, где тип неизвестен. Если вы знаете, что у вас есть C, то вы можете сразу использовать x.swap(y) без проблем.)