問題タブ [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++ - ブースト バリアント: 現在保持されているタイプを取得するには?
私が理解しているように、すべてのタイプのboost.variantは実際のタイプに解析されます (つまり、ブーストvariant<int, string> a; a="bla-bla"
がコンパイル後に に変わるstring a; a="bla-bla"
かのように)。
私が試したこと:
c++ - 変更されない型を持つ各要素の任意/バリアントの C++ コンテナー
std::map<const char*, boost::any>
ライブラリの設定を保存するために使用しています。各設定は単一の基になる値の型のみを使用し、構成の呼び出し中にこれを強制したいと考えてset()
います。設定は、正しいタイプのデフォルト値で初期化されます。
これは、私が達成しようとしていることをうまく示している疑似コードです。
実行時にこのような型エラーをトラップすることは可能ですか? 可能であれば、API にテンプレート関数を含めたくないです。
私は使用しましたが、それが唯一の実行可能な解決策である場合は、boost::any
boost::variant を検討するかもしれません。which()
c++ - 含まれている型を持つバリアントで比較演算子を使用する方法は?
私は自分のコードでバリアントを多く使用しており、バリアントのコンテンツの値をテストするために、いくつかの場所でコンテンツと比較する必要があります。
例えば:
この目的のために私が書いたこの単純なテンプレート関数を使用します。
これはうまく機能しますが、コードが読みにくくなります。私は次のような比較演算子を使用することを好みます。
しかし、演算子の有効な実装を実現できませんでした。問題は、== 演算子がバリアントに既に実装されており、コンパイル時に失敗することです...
とにかくそれを実装する方法を誰かが知っていますか? または、この制限を無効にする方法は? バリアントに含まれる可能性のある型ごとにバージョンを実装する必要がある場合でも、それは問題ではありません。
ありがとう
c++ - std::vector 内にポインターを含む boost::variant を設定する
標準の組み込み型へのポインターを含む、boost::variant 型の std::vector があります。
コード内
これはうまく機能し、boost::get<int *>
orを使用してベクトル内の値にアクセスできますboost::get<double *>
。
ただし、参照を指すのではなく、ベクトル内の要素の値を直接設定できるかどうか疑問に思っていました。言い換えれば、私はこのようなことをしたいと思います
しかし、これはコンパイルされません。これについてのアドバイスはありますか?
ありがとう。
編集:
どうやら、私は自分の質問に答えるのに十分なポイントを持っていないので、代わりに元の質問に私の解決策を入れることにしました。これが、このページに出くわした誰かの助けになることを願っています.
誰かに役立つ場合に備えて、自分の質問に答えると思いました。バリアント内のポインタが参照するものを変更するビジター クラスを作成しました。これがビジター クラスのコードです (もちろん、これはテンプレート化されたクラスにすることができます)。
元の質問のバリアントのベクトルに使用するために、コードは次のとおりです。
c++ - gcc 4.6 で動作する再帰的な boost::variant を作成するにはどうすればよいですか?
私は bencode をデコードしており、gcc 4.4 でうまく動作するコードがいくつかあります。しかし、最近 gcc 4.6 にアップグレードしたため、このコードはビルドされなくなりました。
g++ には次のエラー メッセージが表示されます。
最新のブースト バージョン (現時点では 1.48)のドキュメントには、「いくつかのコンパイラでの標準準拠の問題により、make_recursive_variant は広くサポートされていません」と記載されており、代わりに recursive_wrapper を使用する必要があります。しかし、私は変更を行うのに問題があります.ラッパーを使用してこれがどのように見えるべきか知っている人はいますか?
c++ - boost::variant ストア参照はどのように行われますか?
次のコードはコンパイルされ、「正しいこと」を実行します。
boost::variant は参照をどのように保存しますか? C++ 標準によると、参照の格納方法は完全にコンパイラ次第です。実際、boost::variant
参照によって何バイトが使用されているかをどうやって知るのでしょうか? 、したがって、演算子sizeof(T&) == sizeof(T)
を使用することはできません。sizeof()
現在、参照はおそらくポインターとして実装されていることはわかっていますが、言語には保証がありません。get<>
バリアントが参照を保存しているときに訪問がどのように機能するかについての良い説明は、追加のポイントを獲得します:)
c++ - バリアント タイプ インデックスの n 番目のタイプの値を含むブースト バリアントを構築しますか?
型インデックスで指定されたデフォルトで構築された値を含む s を構築したいboost::variant
- 型インデックスに独自の switch ステートメントを書く必要はありません。
MPL を使えば、これは何とか可能に違いないと思いますか?
ただし、明確にするために、インデックスはコンパイル時の定数式ではありません。
ユースケースは、後で正しい値を含むものに置き換えられるバリアントを作成する必要があるということですが、この時点では型インデックスしか知りません。遅延デシリアライゼーションの問題と考えてください。
c++ - boost :: Variantはどのように文字列定数を許可しますか?
だから私はタイプリストで遊んでいます、そして男の子は彼らが面白いです。私がやりたかったことの1つは、variant
タイプリストがどのように機能し、どのように役立つかについての教育の実験として、自分のクラスを実装しようとすることでした。私のコードは現在次のようになっています。
そして、これは非常にうまく機能します!私は次のようなことを書くことができます、そしてそれは素晴らしい働きをします:
そして、すべてが期待どおりに機能します:-)。これが私の質問です。boost::variant
私は問題なく次のように書くことができます:
私のバージョンでは、同じように書くと:
次のようなエラーが発生します:
基本的に、char[12]
バリアントのタイプリストでは見つかりません。char[12]
実際にはタイプの1つとして明示的にリストされていないため、これは理にかなっています...
これをどのboost::variant
ようにシームレスに機能させるのですか?それがどのように機能するかについての私の理解の中で唯一の本当の欠けている部分であるように私は感じboost::variant
ます。考え?
c++ - boost::ptr_list で前方宣言されたクラス
小さな科学プロジェクトのために、シミュレートされたすべてのオブジェクトを ptr_list に保持する Simulation クラスをセットアップしました。すべてのパーティクルにすばやくアクセスする必要があるため、追加の ptr_list を追加しました。前方宣言されたクラスが好きではないため、ブーストは不平を言うようになりました。recursive_wrapper
すでに指摘されていましたが、ptr_list< recursive_wrapper<Particle> >
どちらもうまくいかないようです。
c++ - Boost::Variant - "呼び出しに一致する関数がありません"
この問題に関して多くの質問がありますが、どれも私の問題の解決策ではないようです。これは本当に Boost::Variant の問題ではないと思います。テンプレートを間違った方法で使用しているだけだと確信しています。コードを削除して、コンパイルして問題を自分で確認できるようにすることができました。それは非常に簡単です.gccから「関数呼び出しなし」エラーが表示され続けます. 私はおそらく愚かなことをしているのですが、何が間違っているのかわかりません。