C++ : Swapping template class elements of different types?

标签 c++ class templates types swap

template< class T1, class T2 >
class Pair {
    T1 first;
    T2 second;
};

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

Pair<T2,T1> swap() {
    return Pair<T2,T1>(second, first);
}

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

编辑:谢谢大家的回答!和我想的差不多,就地交换显然没有任何意义,对 swap() 函数的请求非常模糊。

最佳答案

您不能就地交换,因为T1T2不必是同一类型。 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! 

关于C++ : Swapping template class elements of different types?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2805457/

相关文章:

c++ - 将树数据结构转储到文件或从文件恢复树数据结构

c++ - 如果从类(在单独的文件中)调用,SDL UpdateWindowSurface() 返回 -1

c++ - 派生类特定函数,在重写的虚函数内,由基类指针调用

c++ - 访问修饰符在继承中的不同行为取决于 "this"关键字和模板或缺少它们

c++ - 遍历多个命令行参数

c++ - 在 Eclipse 中缩进函数大括号

java - 需要解释这个 Java 对象初始化语法

class - 结构成员名称是否比我使用继承的类成员使用更多内存?

c++ - io 用于 std::string 的非关联容器

c++ - 作为可变参数模板的结构化参数