2013-07-18 14 views
6

ユニオンを作成する必要がありますが、ユニオンの2つのメンバーは同じタイプなので、それらを識別する方法が必要です。 OCamlでは例えば:同じタイプの複数の同じ型を持つC++のタグ付きユニオン(別名バリアント)

type A = 
    | B of int 
    | C of float 
    | D of float 

Boost.Variantはこのケースをサポートしていないようです、それをサポートして知られているライブラリはありますか?あなたはこれをしたい場合は

+3

同じ「タイプ」の2つの理由は何ですか?一度に1つの組合員しか使用できません。 – hmjd

+2

私は知っていますが、彼らが同じ根底にあるタイプを持っていても、あなたがメンバーに疎遠になりたい場合があります。小さな例は、IntConst intとIntMutable intの2つのメンバーを持つExpr型です。 – maattdd

+2

しかし、共用体のどのメンバーが_active_であるかを示す別のフラグ( 'struct'または' class'を含む)が必要ですか?これは追加の必要な意味を提供するために使用できます。 – hmjd

答えて

5

、私はあなたの最良のオプションは、その後、ブースト変異体は、適切なものを訪れることができます構造体に異なる同じ-が、-種類をラップすることだと思う:

struct Speed 
{ 
    float val_; 
}; 

struct Darkness 
{ 
    float val_; 
}; 

あなたはBOOST_STRONG_TYPEDEFを使用すると自動的にこれを行うことができますが、ユニオンで使用する正当な型を生成することは保証されていません。ここ

2

C++コード:

http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/container_one_of_maybe.hpp

が本当にそれが重複したタイプを含むことができることでタグ付けされた労働組合です。 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、 ラリー

1

あなたは、現時点ではなくC++17's implementation of std::variantは幸いにも、それを可能にすることはできません。

バリアントは、何度も同じタイプの多くを保持するために、そして異なっCV-資格保持することを許され

同じタイプのバージョン。

ブーストバージョンとは異なり、あなたはインデックスで値を取得することができ、このようなものは(テストしていません):

// 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を書いています。

関連する問題