Как добавить std:: swap для моего класса шаблонов?

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

Есть несколько вопросов по этому поводу, но есть много противоречий (человек, дающий решение A 'со многими процентами с человеком B, говорящим 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);

Пожалуйста, дайте свой ответ для С++ 03, и если он все еще работает на С++ 0x, еще лучше!

Ответ 1

Вы не можете перегружать функции в пространстве имен std.

Объявить swap как свободную функцию, перегруженную в том же пространстве имен, что и ваш класс C:

 template<class T>
 void swap(C<T>& x, C<T>& y) { x.swap(y); }

Правильный способ обмена - импортировать std:: swap и использовать неквалифицированную версию (которая возвращается через поиск Koenig на основе пространства имен):

 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) без проблем.)