我有一个可选的 POD 结构,它将包含在联合中。
boost::optional<>
按值保存它的类型,所以我认为这可以工作:
union helper
{
int foo;
struct
{
char basic_info;
struct details {
//...
};
boost::optional<details> extended_info;
} bar;
// ...
};
helper x = make_bar();
if( x.bar.extended_info )
{
// use x.bar.extended_info->elements
}
但是 VS2008 抱怨说我的bar
结构现在由于元素而具有一个复制构造函数。boost::optional<details>
作为替代,我添加了一个布尔标志来指示可选参数是否有效,但它很笨重:
union helper
{
int foo;
struct
{
char basic;
struct details {
bool valid;
//...
} extended;
} bar;
// ...
};
我考虑实施details::operator bool()
以返回details::valid
变量,但这很模糊并且对人类不利。
boost::optional<>
清楚地记录语法和意图,不需要侦探工作。
最后,helper
联合需要是 POD,所以我不能做任何动态分配 - 否则我会使用指针。
boost::optional<>
对在联合中可用的语法相似的东西有什么建议吗?