Вы не можете поменять на месте , поскольку T1
и T2
не обязательно должны быть одного типа. Pair<T1,T2>
отличается от Pair<T2,T1>
. Вы должны вернуть объект другого типа, чем исходный, так что это должен быть новый объект.
Что бы я сделал, это:
template< class T1, class T2 >
Pair<T2,T1> swap(const Pair<T1,T2>& pair) {
return Pair<T2,T1>(pair.second, pair.first);
}
(Нет причин делать это элементом вашего Pair
шаблона.)
Однако вы можете добавить перегрузку для случаев, когда T1
и T2
относятся к одному и тому же типу:
template< class T >
Pair<T,T>& swap(Pair<T,T>& pair) {
using std::swap;
swap(pair.first, pair.second);
return pair;
}
Но это, как упоминал Деннис в своем комментарии, может быть действительно очень запутанным.
Другая идея состоит в том, чтобы определить конструктор преобразования для вашего Pair
шаблона, чтобы неявно конвертируемые типы могли быть заменены:
template< class T1, class T2 >
class Pair {
T1 first;
T2 second;
template< class A1, class A2 >
Pair(const A1& a1, const A2& a2) : first(a1), second (a2) {}
};
Тогда вы можете поменять местами вот так:
Pair<int,double> p1(42,47.11);
Pair<double,int> p2(p1.second,p1.first);
Но обратите внимание, что это также поддерживает другие, возможно нежелательные неявные преобразования:
Pair<char,float> p3(p1.second, p1.first); // narrowing!