Не уверен, что существует термин для этого, кажется, что «выбор» работает. Я работаю на C++, и у меня есть множество союзов, которые мне нужно создать, где союз представляет собой выбор одного из членов профсоюза. Текущий «выбор» отслеживается и всегда доступен. В настоящее время я кодирую эти «союзы» вручную, но мне интересно, есть ли какой-нибудь опрятный трюк для такого рода вещей (полу) автоматически.C++ «Choice» Union
Я столкнулся с профсоюзным ограничением отсутствия перегрузок операторов-операторов или конструкторов-конструкторов или конструкторов копирования при первом попытке реализовать это, но понял, что, поскольку я фактически отслеживаю текущий «выбор», - это очень определенное поведение, которое требуется при почти каждой ситуации.
Вот что я делаю прямо сейчас (только для двух вариантов может быть до 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();
}
};
Спасибо за вашу помощь SO
Это называется вариантом записи в Паскале. C/C++ не имеет специального синтаксиса для них, вероятно, для простоты реализации, и потому что профсоюзы обеспечивают способ достижения аналогичного результата, поэтому зачем беспокоиться. – ninjalj
Спасибо за информацию + историю :) – LorenVS