交换工会的正确方式

proper way to swap unions?

本文关键字:方式 交换      更新时间:2023-10-16

我有一个类,它的成员之一是union。我也是复制/交换习惯用法的忠实粉丝。我突然想到,似乎没有任何正确的(在标准的意义上)交换联合!

这是我能想到的最好的:

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

既然联合(至少在c++03中)要求所有成员都是POD,我不明白为什么这不行。但是感觉不对。有没有更正确的方式来交换工会?这似乎几乎是被忽视的事情。

你们觉得怎么样?

编辑:

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

简体:

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

联合既可复制构造又可赋值,所以没有问题。

为什么不使用经典的交换方案呢?

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