交换工会的正确方法?

时间:2011-04-13 15:53:24

标签: c++ swap unions

我有一个班级,其中有一个联盟作为其成员之一。我也是copy/swap idiom的忠实粉丝。在我看来,交换工会似乎没有任何正确的(在标准意义上)!

这是我能想到的最好的:

char tmp[sizeof(U)];
memcpy(tmp, &u1, sizeof(U));
memcpy(&u1, &u2, sizeof(U));
memcpy(&u2, tmp, sizeof(U));

由于工会(至少在c ++ 03中)要求所有成员都是POD,我不明白为什么这不起作用。但它并没有感觉正确。交换工会有更正确的方法吗?这似乎几乎被忽视了。

你们有什么想法?

修改

好的,看到给出的解决方案后,我觉得有点愚蠢:-)。我注销了传统的解决方案,如std::swap和赋值,因为当我第一次编写代码时,联合是一个匿名联盟。在当前版本的代码中,联合不再是匿名的,传统的解决方案似乎工作得很好。感谢。

2 个答案:

答案 0 :(得分:6)

简单地:

#include <algorithm>
std::swap(u1, u2);

联盟既可以复制,也可以分配,所以没有问题。

答案 1 :(得分:3)

为什么不使用经典交换解决方案?

U u1, u2;
// ...
U t = u1;
u1 = u2;
u2 = t;

由于工会的分配有效,预计会有效。