2010-05-10 38 views
3
template< class T1, class T2 > 
class Pair { 
    T1 first; 
    T2 second; 
}; 

我被要求写一个交换()方法,使得第一元件成为第二和第二第一。我有:C++:交换不同类型的模板类元素?

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

但这返回一个新的对象,而不是交换,在那里我觉得它需要改变自己的数据成员一个void方法。这是可能的,因为T1和T2可能是不同的类类型?换句话说,我不能简单地设置temp = first,first = second,second = temp,因为它会尝试将它们转换为不同的类型。我不知道为什么你可能想要有一个模板对象改变其类型的顺序,因为它似乎会造成混乱,但似乎是我被要求做的事情。

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

+1

我会选择与swap不同的名称。过去人们使用标准库的人会认为'swap'是为了交换同一类型的两个对象的内容。 “翻转”怎么样? – 2010-05-10 19:04:36

+0

@Emile:我不认为这是一个大问题。它是一个'swap()',它需要__one参数___由__two部分组成.__它可以做什么,但交换这些?然而,不寻常的是,它不可能(不过,我不知道怎么做)一个就地交换。这确实不同于我们所知道的swap()。 – sbi 2010-05-11 05:30:30

回答

7

你不能换就地,因为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模板的成员。)

你可以,但是,添加超载T1T2属于同一类型:

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! 
+2

从现场交换到基于过载的场外交换似乎是一个真正的潜在混乱源。 – 2010-05-10 19:27:32

+0

@丹尼斯:我不确定你想告诉我什么。 ':-x' – sbi 2010-05-10 21:44:32

+0

你建议为'T1'和'T2'是同一类型提供一个重载。但是,这种重载提供了与原始形式完全不同的语义。 'a = swap(b)'可能会也可能不会修改'b',具体取决于类型。这不是我所期望的。 – 2010-05-10 22:19:51

2

只有T1可以被转换成T2,反之亦然才能进行转换。如果可能的话,那么你可以写

T2 temp (first); 
first = T1(second); 
second = temp; 

(请注意,您无法从Pair<T1,T2>改变*thisPair<T2,T1>这个void功能。)

1

由于pair <T1,T2>pair <T2,T1>是你不能用它来交换不同类型。当没有给出内置交换操作时(例如,在std::vector有一个交换操作),交换本身也不会比使用临时变量更多。 Howeyer你可以使用引用创建一个新类型。或者你使用指针,其中复制便宜。

std::pair<int, float> a = std::pair <int, float> (3,3.5); 
    std::pair<const float &, const int&> b = std::pair<const float &, const int&> (a.first, a.second);