不确定是否有一个术语,“选择”似乎有效。我在 C++ 中工作,我需要创建一堆工会,其中工会代表工会成员之一的选择。当前的“选择”被跟踪并且始终可用。我目前正在手动编码这些“联合”,但我想知道是否有任何巧妙的技巧可以(半)自动地完成这类事情。
在我第一次尝试实现这个时,我遇到了没有赋值运算符重载或非平凡构造函数或复制构造函数的联合限制,但我意识到因为我实际上是在跟踪当前的“选择”,所以有非常明确的行为几乎在所有情况下都能接受。
这就是我现在正在做的事情,(只有两个选择,可能最多 10 或 15 个),它的代码量相当大,几乎所有这些都只是样板文件。此外,如果有人对我下面的内容是否有效有任何意见,那将是很棒的,仍然会发现 C++ 的一些疯狂......
struct MyChoice
{
struct Choice1
{
int a;
char* b;
};
struct Choice2
{
bool c;
double d;
};
enum Choice
{
Choice_Choice1,
Choice_Choice2
} choice;
char _value[max(sizeof(Choice1),sizeof(Choice2))]; // could be private
Choice1& choice1()
{
if(choice == Choice_Choice2)
{
(*(Choice2*)_value)->~Choice2();
(*(Choice1*)_value) = Choice1();
choice = Choice_Choice1;
}
return *(Choice1*)_value;
}
Choice2& choice2()
{
if(choice == Choice_Choice1)
{
(*(Choice1*)_value)->~Choice1();
(*(Choice2*)_value) = Choice2();
choice = Choice_Choice2;
}
return *(Choice2*)_value;
}
MyChoice()
{
_choice = Choice_Choice1;
(*(Choice1)_value) = Choice1();
}
MyChoice(const MyChoice& other)
{
this->_choice = other.choice;
if(this->_choice == Choice_Choice1)
(*(Choice1*)_value) = other.choice1();
else
(*(Choice2*)_value) = other.choice2();
}
~MyChoice()
{
if(_choice == Choice_Choice1)
(*(Choice1)_value)->~Choice1();
else
(*(Choice2)_value)->~Choice2();
}
};
谢谢你的帮助