ユニオンを作成する必要がありますが、ユニオンの2つのメンバーは同じタイプなので、それらを識別する方法が必要です。 OCamlでは例えば:同じタイプの複数の同じ型を持つC++のタグ付きユニオン(別名バリアント)
type A =
| B of int
| C of float
| D of float
Boost.Variantはこのケースをサポートしていないようです、それをサポートして知られているライブラリはありますか?あなたはこれをしたい場合は
ユニオンを作成する必要がありますが、ユニオンの2つのメンバーは同じタイプなので、それらを識別する方法が必要です。 OCamlでは例えば:同じタイプの複数の同じ型を持つC++のタグ付きユニオン(別名バリアント)
type A =
| B of int
| C of float
| D of float
Boost.Variantはこのケースをサポートしていないようです、それをサポートして知られているライブラリはありますか?あなたはこれをしたい場合は
、私はあなたの最良のオプションは、その後、ブースト変異体は、適切なものを訪れることができます構造体に異なる同じ-が、-種類をラップすることだと思う:
struct Speed
{
float val_;
};
struct Darkness
{
float val_;
};
あなたはBOOST_STRONG_TYPEDEF
を使用すると自動的にこれを行うことができますが、ユニオンで使用する正当な型を生成することは保証されていません。ここ
C++コード:
が本当にそれが重複したタイプを含むことができることでタグ付けされた労働組合です。 1つの素晴らしい機能 タグは列挙できます。したがって、タグは意味のある名前を持つことができます。
残念ながら、実装 は再帰的な継承を使用するため、残念ながら、コンパイル時のコストはかなり悪いと思います。 OTOHの場合、コンパイラは最終的にコンパイル時間を短縮する方法を最終的に見つけ出すでしょう。
OTOH、boost :: variantに固執したい場合は、 をマークBとして推奨します。ただし、マークBの記述クラス名の代わりに を使用すると、fusion::pair<mpl::int_<tag>,T_tag>
を使用できます。ここで、T_tag
はソースfusion::vector
のタグ番目の要素です。 IOW:融合ドキュメントとして
variant
< fusion::pair<mpl::int_<1>,T1>
, fusion::pair<mpl::int_<2>,T2>
...
, fusion::pair<mpl::int_<n>,Tn>
>
:
http://www.boost.org/doc/libs/1_55_0/libs/fusion/doc/html/fusion/support/pair.html
はfusion::pair
が唯一の第二のテンプレート引数にスペースを割り振り、と言います。したがって、 これはboost::variant<T1,T2,...,Tn>
より多くの部屋を取るべきではありません。
HTH。
-regards、 ラリー
あなたは、現時点ではなくC++17's implementation of std::variant
は幸いにも、それを可能にすることはできません。
同じタイプのバージョン。
ブーストバージョンとは異なり、あなたはインデックスで値を取得することができ、このようなものは(テストしていません):
// Construct a variant with the second value set.
variant<string, string, string> s(std::in_place_index<1>, "Hello");
// Get the second value.
string first = std::get<1>(s);
マイケルパークがa C++14 implementation of C++17's std::variant
を書いています。
同じ「タイプ」の2つの理由は何ですか?一度に1つの組合員しか使用できません。 – hmjd
私は知っていますが、彼らが同じ根底にあるタイプを持っていても、あなたがメンバーに疎遠になりたい場合があります。小さな例は、IntConst intとIntMutable intの2つのメンバーを持つExpr型です。 – maattdd
しかし、共用体のどのメンバーが_active_であるかを示す別のフラグ( 'struct'または' class'を含む)が必要ですか?これは追加の必要な意味を提供するために使用できます。 – hmjd