不确定是否有这样的术语,“选择”似乎工作。我正在使用C++,并且我需要创建一组工会,其中工会代表工会成员之一的选择。目前的“选择”被跟踪并始终可用。我目前手动编写这些“工会”,但我想知道是否有任何干净的伎俩自动做这种事情(半)。C++“选择”联盟
我遇到了没有赋值运算符重载或非trival构造函数或复制构造函数在我尝试实现这一点的第一回合的联合限制,但意识到,因为我实际上跟踪当前的“选择”,那里几乎在所有情况下都是非常明确的行为。
下面是我现在正在做的事情(只有两种选择,可能会达到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();
}
};
感谢您的帮助,所以
这就是所谓的Pascal变体记录。 C/C++对于它们可能没有特别的语法,可能易于实现,并且由于工会提供了一种实现类似结果的方法,所以为什么要麻烦。 – ninjalj 2010-07-21 21:37:41
感谢信息+历史:) – LorenVS 2010-07-21 21:45:31