問題タブ [boost-variant]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++標準ライブラリのboost::Variantに相当するものは何ですか?
Cスタイルのユニオンに代わるものを探しています。boost::variantはそのようなオプションの1つです。std C ++に何かありますか?
c++ - Boost.Variant と C++11 を使用した Boost.Spirit: 引数なしのコンストラクターを期待する
Boost.Spirit を使用して簡単な文法をコンパイルしようとしています。Arch Linux x86_64 で g++ 4.7.0 とブースト 1.49.0-1.1 を使用しています。
ここでの最終的な目標はアセンブラです。それぞれ 1 つのクラスを持つ複数のオペランドがあります。すべてのオペランド型がまとめて 1 つのboost::variant型に格納されます。
direct文法のbase_typeでもある場合、このサンプルをルールまでコンパイルすることに成功しましたが、ルールを導入するoperand(そしてそれをベースタイプにする)と、g ++ 4.7.0は次のように不平を言います:
DirectOperandセマンティックアクションはコンストラクターでそれを呼び出す必要があるため、 のデフォルトコンストラクターを探す必要がある理由がわかりません。
を含む多くのバリエーションを試しました
次のように、タイプを「強制」するヘルパー関数を作成することさえできます。
しかし、私が何をしても、デフォルトのコンストラクターが欠落していると不平を言います。
ゼロ引数のコンストラクターを実際に定義したところ、それがコンパイルされていることがわかりましたが、それDirectOperand::value_は割り当てたデフォルト値から決して変化しませんでした。
これがコードです。できる限り短いです。
c++ - さまざまなタイプの可変数のコンテナーを返すにはどうすればよいですか?
次のようなデータがあります。
ファイルが異なれば名前付き列の数も異なり、各列の値の型は float、int、および string の間で異なります。
指定された列のデータを適切なタイプのコンテナーに入れる列readColsの名前を送信する関数を作成したいと考えています (たとえば、列tokenと列が必要な場合があります)。rank
私の問題は、ファイルの解析ではなく、さまざまなタイプを含む可変数のコンテナーを返すことです。たとえば、tokenおよび列をおよびコンテナーにそれぞれrank入れたいとします。ここでの問題は、代わりに (ベクトルに格納された) 列が必要になる可能性があり、考えられるすべての型の組み合わせに対して異なる関数を記述したくないということです。(コンテナのタイプは私には関係ありません。s のみを使用する必要がある場合は問題ありません。各コンテナに異なるタイプが含まれていることが重要です。)vector<string>vector<int>epsreadColsvector
おそらく、さまざまな種類のコンテナーを保持するために、さまざまな型を保持するコンテナーが必要になるでしょう。Boost.Variantが私が望む解決策のように見えますが、パーサーに各列をどの型にするかを伝える方法がわかりません (型名のリストのようなものを作成できますか? などvoid readCols(string filename, vector<variant<various types of vector>> &data, vector<string> colNames, vector<typename> convertTo))。同様に、Boost.Mpl.Vectorは問題を解決するかもしれませんが、ここでも、readCols各列がどのようにキャストされるかを知る方法がよくわかりません。
少なくとも 2 つの回避策が考えられます。
- 任意のコンテナーに読み込むテンプレート化された関数を使用して、各列を個別に読み取ります (
container::value_type関数が解析方法を認識できるようにします)。私はこの解決策を好みません。なぜなら、ファイルが時々大きくなる (数百万行) ため、ファイルを複数回解析すると余分に数分かかるからです (計算に 30 分ほどかかるプログラムでは、実行時間の無視できる割合ではありません。プログラムは何度も走ります)。 - すべての列を文字列のコンテナーに読み取り、解析コンテキストではなく呼び出しコンテキストで再キャストします。
std::transformandboost::lexical_castまたは s/tを使用して 1 行で変換できると思うので、これはそれほど悪くはありません。2n行の肥大化を避けることができれば、すばらしい (n= 列の数、通常は 2 または 3、コンテナーを宣言してから変換するための列ごとに 2 行)。
2 番目の回避策は、完全で一般的な解決策よりもはるかに少ない労力で済む可能性があります。もしそうなら、私は知りたいです。2 番目の回避策の方が効率的かもしれないと想像しますが、現時点では主に使いやすさに関心があります。ジェネリックreadCols関数を 1 つ記述してそれで完了できるなら、それが私の好みです。
c++ - boost::variant のシリアル化
boost::variant 型の非POD クラスをシリアライズしたいと考えています。それが可能かどうか教えてください。また、その方法を教えてください。
c++ - boost::variantの型に共通のメソッドを呼び出す
私のすべてのタイプがboost::variant同じメソッドをサポートしている場合、それを一般的に呼び出す方法はありますか(つまり、のメソッドごとに個別に呼び出さないでstatic_visitorください)?
私はこのようなものを機能させようとしています:
しかし、それは言ってコンパイルに失敗します'boo' : is not a member of 'boost::variant<T0_,T1,T2>'。
現在、いくつかのクラスはすべてインターフェイスから継承しているため、それらの単一の共有メソッドを多態的に使用できます。また、他のすべてのメソッドは各具象クラスに固有であるため、訪問者を介してクラスを使用できるようにしたいと思います。boost::variant私は、ここで自分の訪問者メカニズムを実装するよりも良い代替手段になることを望んでいました。それは...ですか?
c++ - boost::gcc でのバリアント リンカー エラー
以下がコンパイルされない理由を理解しようとして、私は少し頭がおかしくなっています:
これは私が得ているコンパイラエラーです:
/usr/include/testing/test_code.o||関数内
'std::array<boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, 5ul>::array(std::array<boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, 5ul> const&)':|
store.cpp:(.text._ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC2ERKS6_[_ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC5ERKS6_]+0x31)||undefined reference to'boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::variant(boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_> const&)'|
||=== ビルドが終了しました: 1 エラー、0 警告 ===|
私が交換した場合:
と:
コードはコンパイルされますが、パフォーマンス上の理由から boost::any を使用したくありません。
c++ - ブースト バリアント再帰ラッパーを使用した文字列パーサー
以下のコード (spirit qi mini_xml の例から適応) はコンパイルされません。bracrecursive の属性を持つルールに関連するエラーがありますboost::variant。
ただし、すべてのコメント アウトされたバージョンbracはコンパイルされます。
この場合、単純な文字列パーサーが特別な理由を知りたいと思っています。
エラー メッセージの一部:
前もって感謝します。
c++ - バリアントistringstreamおよびストリームエラーをブーストします
Visual Studio2010sp1を使用しています。Windows7でC++とブースト1.47を使用
私は次のコードを持っています:
また、istringstreamをistreamに置き換えてみました。次のエラーが発生します:
istringstreamiを宣言した場合; エラーは発生しません。istream i2を宣言すると、同様のエラーが発生します。
私は何が間違っているのですか?
istreamまたは派生クラスが必要な理由は、作業中のSQLライブラリ用です。具体的には、mysqlの実装では、setBlobを呼び出すためにistreamまたはistringstreamが必要です...
文字列を渡し、文字列ストリームを文字列で初期化することで、一時的に回避策を見つけました。ただし、私のバリアントタイプがistreamstreamを使用できるか、さらに良い場合はistreamを使用できると便利です。
ありがとう、フランク
c++ - 値渡しは、パラメーターがconstであると見なします
Visual Studio Enterprise 2010、sp1、Windows764ビット。1.48.0をブーストします。
ここから関連するコードを開始します。これらのビットはヘッダーで定義されます。
これは、コピーコンストラクターの本体にあります。
私が見つけたエラーは、ラムダのパラメーターリストにあります。スワップが呼び出されていると思いますが、ペアのコピーコンストラクターでは、最初にラムダに渡された右辺値からパラメーターに割り当てようとしています。コンパイラーは、「value.first」がstd :: pairコピーコンストラクターで割り当てられている場合、それがconstであると見なします。しかし、明らかに、パラメーターはconst修飾されておらず、mapped_typeまたはkey_typeはconst修飾されておらず、コピーコンストラクターはconstメソッドではなく、いずれも重要ではありません。
どういうわけか、テンプレートパラメータはconst修飾されており、私の一生の間、その理由を理解することはできません。
何か他のものがコンパイラーを作動させていると思いますが、私は他に何もすることがありません。以前、ソースコードをよくかき混ぜて、これを理解しようとする前に、このエラーメッセージのオンとオフを切り替えることができました。boost::static_visitor派生クラスを定義しました。メンバーもメソッドも何もありません。これで、ここのコピーコンストラクターでこのエラーが発生しました。実際に問題のあるコード行を分離する方法を他に想像することはできません...
誰かがこれがコンパイラの問題であり、言及されていない変更がこれを副作用として持っていると思いますか?