【发布时间】:2011-06-08 02:51:01
【问题描述】:
我有一个可选的 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 结构现在 had a copy constructor 由于 boost::optional<details> 元素。
作为替代,我添加了一个布尔标志来指示可选参数是否有效,但它很笨重:
union helper
{
int foo;
struct
{
char basic;
struct details {
bool valid;
//...
} extended;
} bar;
// ...
};
我考虑实现 details::operator bool() 以返回 details::valid 变量,但这很模糊,而且对人类不利。boost::optional<> 清楚地记录了语法和意图,不需要进行侦探工作。
最后,helper union 需要是 POD,所以我不能做任何动态分配 - 否则我会使用指针。
对于语法上类似于 boost::optional<> 的东西有什么建议可以在联合中使用吗?
【问题讨论】:
-
为什么不能使用指针?允许动态分配 POD;它只是没有自动初始化。还是您的
helper联合需要考虑您的bar结构的大小? -
union是按值复制的,作为字节发送给另一个进程,所以不能共享内存。
-
将非 POD 类型转换为字节是未定义的行为。您必须使用 POD 类型进行二进制序列化。实际上,现在大多数不使用二进制通信协议,而是使用基于 XML 的通信协议。
-
你是对的。不幸的是,这是一个遗留产品,不能轻易更改。我一口一口地吃这头大象。
标签: c++ boost optional-variables