2016-09-23 14 views
0

はタイトルとしてはかなり説明していますが、boost::variant<std::vector<int>, std::vector<string>>変数を繰り返し処理するにはどうすればよいでしょうか?boost :: variant <std :: vector <int>、std :: vector <String>>を反復処理する方法は?

は、私が構造を持っていると言う:

struct foobar{ 
    enum typeOfVariant {intVariant, StringVariant} 
    boost::variant<std::vector<int>, std::vector<String>> variable; 
    } 

私は列挙型がバリアントの型にcorelatedされていることを保証して、ある時点で受け取ること。

boost::variant<std::vector<int>, std::vector<string>> var; 

for (auto t in var) 
{ 
//do something 
} 

^これは理想的な方法であるかもしれない:多分ような何かを達成するために

または、列挙型に基づいてstd::vector<int>またはstd::vector<string>に強制的に変換しますか? C++ 14では

+0

'std :: visit'の何が問題なのですか? – Yakk

+0

@Yakkそれはブーストにありませんか? Boostのバージョン( 'apply_visitor'という名前)は、ドキュメントによると、あなたがC++ 14でない限り、' result_type' typedefも必要です。 –

+0

** - 1 **表示されるコードは**実際のコードではありません**。セミコロンの欠如。また、 "列挙型は、バリアントのタイプとコアレットされています。"タイプは意味がありません:タイプは動的な値と相関することはできません。すべての誤解を招くようなものを除いて、疑問は単純に 'boost :: variant'が保持するものにアクセスする方法です。**ドキュメント**にはそのことが示されています。 –

答えて

1

apply_visitor(var, [&](auto&& var){ 
    for(auto&& t : var) { 
    // code goes here 
    } 
}); 

enumの必要はありません。変種は自分自身の中にどのようなタイプがあるかを知っています。

A variantは組合と組合で正しいタイプへのインデックスです。そのインデックスは基本的にenumです。

ifブロックと2つのバージョン(それぞれのコンテンツが1つのタイプまたは別のものなど)であると仮定して外部から行うことはできますが、バルクを追加し、価値を付加することはめったにありません。

ほとんど名目上はC++ 11のコンパイラは上記を扱うことができます。それがなければ、それを複製する関数オブジェクトクラスを手動で書くか、 "条件付きキャスト"を使用してループを各タイプごとに2回書くことができます。

私はC++ 14の解決される問題、何を​​言うことができます。

関連する問題