ユニオン内に含まれるオプションの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<>
ユニオンで使用できる構文的に類似したものについての提案はありますか?