У меня есть необязательная структура POD, которая будет содержаться внутри объединения. boost :: optional
хранит свой тип по значению, поэтому я подумал, что это может сработать:
union helper
{
int foo;
struct
{
char basic_info;
struct details {
//...
};
boost::optional extended_info;
} bar;
// ...
};
helper x = make_bar();
if( x.bar.extended_info )
{
// use x.bar.extended_info->elements
}
но VS2008 пожаловался, что моя структура bar
теперь имеет конструктор копирования из-за элемента boost :: optional
.
В качестве замены я Мы добавили логический флаг, чтобы указать, действителен ли необязательный параметр, но он неуклюжий:
union helper
{
int foo;
struct
{
char basic;
struct details {
bool valid;
//...
} extended;
} bar;
// ...
};
Я подумывал о реализации details :: operator bool ()
для возврата details :: valid
, но это неясно и оказывает медвежью услугу человечеству. boost :: optional
четко документирует синтаксис и намерение и не требует детективной работы.
Наконец, объединение помощника
должно быть POD, поэтому я не могу выполнять какое-либо динамическое распределение - в противном случае я бы использовал указатель.
Любые предложения для чего-то синтаксически похожего на boost :: optional
, который можно использовать в объединении?