問題タブ [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++ - グーグルテストEXPECT_EQとboost::make_recursive_variant
私は以下のようなブースト再帰バリアントを持っています。assertを使用して2つの再帰バリアントオブジェクトを比較すると、正常に機能しますが、EXPECT_EQを使用すると、コンパイルエラーが発生します。
boost / v1.46.1 / include / boost / Variant / detail / Variant_io.hpp:64:エラー:'operator <<' in'((const boost :: detail :: Variant :: printer >> *)thisに一致しません)-> boost :: detail :: Variant :: printer >> ::out_<<オペランド'</p>
c++ - boost::variantの使用法
私はwxWidgetsを介してGUIアプリケーションを開発しています。GUI部分と「ロジック」部分の2つの部分があります。Logicの部分をwxWidgetsから完全に独立させたいです。しかし、GUIの1つのコンポーネントがwxVariantを返し、ロジック部分で使用する必要があります。
だから私はwxVariantをブーストするために「変換」する方法を探しています::variant
wxVariantは次のように機能します。
だから私は次のようなことを考えています
このようにboost::Variant(またはboost :: Any)を使用することは可能ですか?
c++ - 自動発電機に関連するブースト精神カルマとブーストバリアントの「概念」
std::vector<boost::variant<..>>
他のオブジェクトによって提供される装飾を使用してデシリアライズする必要があります。
「装飾」によって可能になることの 1 つは、ベクター内の空のエントリです。私は実際の実装でレンガの壁にぶつかりました。しかし、私はそれをシュリンクラップすることに成功しました。コンパイルするコード:
必要な概念とともに、「未定義」タイプを実装しようとする問題のある変更。
karma::generate
ステップをコメントアウトするstd::cout
と、有効な式 (Boost::variant OutputStreamable
) になります。Spirit では、ジェネレーターにはOutputStreamable
(spirit::karma ) である型を指定する必要があり、型をノーオペレーションとして作成したため、OutputStreamable
上記のバリアントはそうである必要があります。OutputStreamable
undefined
OutputStreamable
何を与える?:(
2 レベル以上のテンプレートの間接化を持つライブラリを使用する場合、C++ のテンプレート メカニズムに価値があるかどうか、私は本当に疑問を持ち始めています。おそらく私はまっすぐに戻る必要があります-c.
編集1:
わかりました、Clangは私に賢明なfirst
エラーを与えました...
error: no type named 'properties' in 'boost::spirit::karma::no_auto_mapping_exists'
ここで、undefined を no-op としてマップして、クリーンな変換を行う方法を理解する必要があります。このスピリットのドキュメント エントリ(および具体的にはこれ) は、私が調査する必要があることを説明しています。スピリットによって提供される一般的な未定義のタイプ、またはブーストで定義されたタイプはありますか?そのスピリットはすでに no-op としてマップされていますか?
編集2:
std::vector<boost::optional<boost::variant<..>>>
Spirit はそれらに型推論を提供するので、かなり魅力的に見え始めています。
c++ - boost::variant でこのカスタム タイプにアクセスできないのはなぜですか?
次のコード:
次のエラーが発生します。
私はもともと非常に単純な A を使用しようとしましたが、Boost.Variant が BoundedTypes に配置するすべての要件を満たそうとしていました。A 昔は
訪問者は文字列値で問題なく動作しますが、A にアクセスしようとしてもコンパイルできません。私は gcc-4.4.5 を使用しています。何か案は?
c++ - ブーストバリアントで同じデータ型を使用する
Boost varaintに格納される値を明示的に型キャストできますか?
例:
ここでは、which()関数で3を再実行したいのですが、常に0を再実行します。which_(クラスバリアントのプライベート変数)の値を直接変更したり、使用するデータ型を明示的に指定したりする方法はありますか?
よろしくアンキス
boost - boost::static_visitorの要件
バリアントと構造に対するboost::static_visitorの適用について少し混乱しています。以下にテストケースを含めました。「s_visitor」のコメントアウトされたセクションについて、次のエラーメッセージが表示される理由または修正方法がわかりません。
apply_visitor_unary.hpp:72:エラー:「structs1」には「apply_visitor」という名前のメンバーがありません</ p>
助けや説明をありがとう。
c++ - ファイルのコンパイルに関するバリアントの問題
このページから次のコードをコンパイルしてみました: http ://www.pdc.kth.se/training/Talks/C++/boost/libs/variant/doc/sample.html
「二分木の実装」の下で、私は解決するのに苦労しているたくさんのエラーを受け取りました。コードブロックでgcc3.4.5を使用しています。
そして、コンパイル中のトレースバック:
c++ - このような場合、スタックとヒープとブースト::プールの割り当てを決定する方法は?
次のように、boost::variantを使用してdoubleまたはstringを格納するクラスがあります。
これは、私が遊んでいるおもちゃのインタプリタにとっては不変の値型であると考えられています。最初は、const参照で渡し、値で返すことをお勧めします。プリミティブとして扱いたいので、常にスタックに割り当てます。しかし、サイズが40バイトであることがわかり(ほとんどの場合、sizeof std :: stringが原因です)、少し心配でした。スタックに大きなメモリチャンクを割り当てるべきではないことはわかっていますが、大きすぎるのはどれくらいですか?
また、戻るたびに40バイトをコピーすることは、特に値が不変であり、コピーする必要さえないため、少し無駄に思えます。
オプションの通常のヒープ割り当ては、1秒あたり数千のこれらの割り当て/割り当て解除を行うことができるため、あまり魅力的ではないようです。
私が思いついた最後のオプションは、必要に応じてこれらのオブジェクトを割り当てるためにboost :: poolを用意し、それらの存続期間を管理するためにboost::shared_ptrを使用することです。ただし、インタプリタがメモリ割り当てを担当するため(メモリ割り当てのタイプは、テンプレート引数としてインタプリタに渡されるポリシーになります)、これは、値クラスがインタプリタについて知る必要があることを意味し、少し複雑になります。 。
だからこれらは質問です:
- この場合、どうすればよいですか、またその理由は何ですか?
- スタックに割り当てるには「大きすぎる」の大きさはどれくらいですか?それは、割り当てられる頻度とコピーする必要がある頻度にもよると思います。
ありがとう。
c++ - ブースト バリアント: JSON をモデル化する方法は?
Boost SpiritストアJSONオブジェクトを使用してJSON文字列を再帰的なデータ構造に解析しようとしています:
そして、ここに私のコードがあります:
コンパイルすると、次のエラーが表示されます。
さらに、JsonValue を JsonObject に安全にキャストする方法は? 私がやろうとすると:
これにより、実行時例外/致命的なエラーが発生します。
どんな助けでも大歓迎です。
編集:
@Nicol のアドバイスに従って、次のコードを作成しました。
JsonObject と JsonArray を次のように簡単に操作できます。
投稿するだけで、誰もが恩恵を受けることができます。
c++ - boost :: spirit :: qi :: parse()がこのboost :: Variantの値を設定しないのはなぜですか?
テキストをboost::Variantに解析しようとすると、バリアントの値は変更されません。パーサー自体は正常に機能しているように見えるので、バリアントコードで何か問題が発生していると思います。
Boost 1.46.1を使用しており、次のコードはVisualStudio2008でコンパイルされます。
最初の更新
hkaiserは、ルールと文法テンプレートの引数は。でなければならないことに注意しましVariant
たVariant()
。
でコンパイルエラーが発生したため、これは少し「さらに」なりましたboost_1_46_1\boost\variant\variant.hpp(1304)
。コメントは言う:
したがって、式の属性はで(qi::double_ | +qi::char_)
はないようboost::variant<double, std::string>
です。しかし、それは何ですか?
2回目の更新
typedef boost::variant<double, std::vector<char>> Variant;
パーサーの作品を使用しています。ただし、これはstd ::string...ほど簡単には使用できません。