我有两个通信类,它们永远不会同时存在,但都将被使用。
示例:
class CommA
{
public:
void SendA();
...
private:
ProtocolA a;
...
}
class CommB
{
public:
void SendB();
...
private:
ProtocolB b;
...
}
有可能把它们放在联盟里保存记忆吗?
union CommAB
{
CommA a;
CommB b;
}
其他人已经在评论和回答中提出了std::variant
。我将解释为什么它是推荐的方法。
关于工会,有一件重要的事情需要知道:在任何时候,工会中只有一名成员可以活跃。如果您创建了一个AB
对象,它要么是a
,要么是b
,如果您访问了错误的对象,它就是UB。你怎么知道哪一个是活动的?幸运的是,该标准提供了一些保证:如果所有联盟成员的类都以相同的公共成员开头,则可以安全地访问这些类。通常的技巧是在联盟的所有类别中都有一个第一个成员来确定哪个是活跃的。另一个问题可能是当你有一个活跃的会员并想更改它时。
variant
的优点是它可以处理这些实际方面,而不必担心,也不必调整成员的类。
既然你在寻找空间:工会占据了其最大成员的空间。因此,如果你必须在类中添加一个常见的额外成员来跟踪活动的联合成员,那么你的联合将比最初的a或B更大。变体为你做了这项工作,所以它也会更大。