C++:交换不同类型的模板类元素?

met*_*ics 3 c++ templates swap types class

template< class T1, class T2 >
class Pair {
    T1 first;
    T2 second;
};
Run Code Online (Sandbox Code Playgroud)

我被要求编写一个swap()方法,以便第一个元素成为第二个元素,第二个元素成为第一个元素.我有:

Pair<T2,T1> swap() {
    return Pair<T2,T1>(second, first);
}
Run Code Online (Sandbox Code Playgroud)

但是这会返回一个新对象而不是交换,我认为它需要是一个改变自己的数据成员的void方法.这是可能的,因为T1和T2可能是不同的类类型吗?换句话说,我不能简单地设置temp = first,first = second,second = temp,因为它会尝试将它们转换为不同的类型.我不确定为什么你可能希望有一个模板对象改变其类型的顺序,因为它似乎会引起混淆,但这似乎是我被要求做的事情.

编辑:谢谢大家的回答!就像我想的那样,交换到位显然没有任何意义,对swap()函数的请求非常模糊.

sbi*_*sbi 8

您不能就地交换,因为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);
}
Run Code Online (Sandbox Code Playgroud)

(没有理由将其作为Pair模板的成员.)

但是,您可以为何时和类型添加重载:T1T2

template< class T >
Pair<T,T>& swap(Pair<T,T>& pair) {
    using std::swap;
    swap(pair.first, pair.second);
    return pair;
}
Run Code Online (Sandbox Code Playgroud)

但正如丹尼斯在评论中提到的那样,这可能确实非常令人困惑.

另一个想法是为您的模板定义转换构造函数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) {}
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样交换:

Pair<int,double> p1(42,47.11);
Pair<double,int> p2(p1.second,p1.first);
Run Code Online (Sandbox Code Playgroud)

但请注意,这也支持其他可能不需要的隐式转换:

Pair<char,float> p3(p1.second, p1.first); // narrowing! 
Run Code Online (Sandbox Code Playgroud)

  • 从就地交换到基于过载的异地交换似乎是真正潜在的混淆源. (2认同)