問題タブ [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イテレータを使用して「パラメータを変換できません」
同じタイプのオブジェクトを格納するさまざまなタイプのイテレータを使用できる関数を作成したいと思います。1つ
はstd::map
containing shared_ptr<Foo>
(typedef-ed as FooMap
)で、もう1つはstd::list
contains shared_ptr<Foo>
(FooList
)です。
私は、MSaltersが同様の質問に対して提案したソリューションが本当に好きで、イテレーターを実装しようとしましたboost::variant
。イテレーターは、関数が最初から2番目に反復するパラメーターとして取得します。
私の関数は次のようになります(かなり単純化されています):
FooIteratorと訪問者は次のように定義されます。
私はこのメールの添付ファイルから上記のほとんどを手に入れました。そのソリューションは、MSaltersの回答によると、アダプターとポリシーも使用しますが、これは少し多すぎるようです。そのため、そのコードを単純にコピーしたくありません。特に私はその一部しか理解していないので。
上記のコードを使用すると、VS2008から次のコンパイラエラーが発生します(これは合計160の最初の数行にすぎないため、ここに投稿するには少なすぎると思います。ただし、誰かが追加したい場合は、喜んで追加します。すべて見る):
私は何が間違っているのですか?
c++ - boost :: Variantが演算子を提供しないのはなぜですか!=
2つの同一のboost::variant
インスタンスa
とが与えられるとb
、式( a == b )
は許可されます。
しかし( a != b )
、未定義のようです。どうしてこれなの?
c++ - 生のブースト::バリアントをシリアル化しても安全ですか?
boost::variantは、それが値型であると主張しています。これは、POD タイプのみが含まれている限り、boost::variant の生の表現を単純に書き出して、後でロードし直すことが安全であることを意味しますか? 同じアーキテクチャで、同じコンパイラと同じバージョンのブーストでコンパイルされたコードによって再ロードされると仮定します。
また、(おそらく) 同様に、boost::variant を共有メモリで使用できますか?
c++ - Boost.Any と Boost.Variant の比較
Boost.Any と Boost.Variant の選択に問題があります。
それぞれをいつ使用する必要がありますか?
それぞれの長所と短所は何ですか?
基本的に、外部ソースからいくつかの状態を保存しようとしています。
c++ - boost::variantでタイプを反復処理します
いくつかの生成された型を保持するためにブーストバリアントを使用しています。現在、コードジェネレーターは、型とそれらを保持できるバリアントを含むヘッダーを作成します。初期化時に、バリアントが現在保持しているタイプではなく、バリアントで許可されているタイプを繰り返し処理したいと思います。
バリアントでこれを行うことはできますか?
c++ - ブースト::バリアントの問題、セグメンテーション違反を与えるリンカ
7種類のブーストバリアントがあります。最後の 2 つのタイプを使用しようとすると、リンカーがセグメンテーション違反を起こします。64 ビット Linux マシンで g++ (SuSE Linux では gcc バージョン 3.3.3) を使用していますが、次のエラーが表示されます。
タイプをどの順序で配置しても問題ありません。最後の 2 つを使用しようとすると、セグメンテーション違反が発生します。なぜこれが起こるのでしょうか?
コード:
ClassX::Ptr は、そのクラスへのブースト共有ポインターです。Ptr は、以下のようにクラス自体の内部で typedef として定義されます。
次のようにブーストバリアントで最後の2つのタイプを使用しようとすると
boost::variant を (Class6 と Class1 の交換) として定義した場合
次に、このコードをコンパイルするときに segfault が発生します
c++ - Boost.Variant へのメンバー関数の追加
私の C++ ライブラリには、型boost::variant<A,B>
と、この型を入力として取得する多くのアルゴリズムがあります。メンバー関数の代わりに、この型にはvoid f( boost::variant<A,B>& var )
. これはテンプレートでも実現できることは知っていますが、これは私のデザインには適していません。
私はこのスタイルのプログラミングに非常に満足しています:
しかし、このライブラリの一部のユーザーはそれに慣れておらず、Boost.Variant の概念が型定義によって隠されているため、v.f()
.
これを実現するには、2 つの可能性を考えることができます。1) からのオーバーライドと、2)独自のメンバー関数をboost::variant
再実装して追加することです。boost::variant
これらのアイデアが良いかどうかはわかりません。これについて何か助けてもらえますか?他の可能性はありますか?
c++ - boost::variant のイテレータ
やあ、
既存のコードを boost::variant に適合させようとしています。アイデアは、異種のベクターに boost::variant を使用することです。問題は、残りのコードが反復子を使用してベクトルの要素にアクセスすることです。イテレータで boost::variant を使用する方法はありますか?
私はもう試した
しかし、うまくいきませんでした。
編集:助けてくれてありがとう!しかし、私の設計では、リストから 1 つの要素を取得し、それをコードの他の部分に渡す必要があります (GSL を使用しているため、これは厄介な場合があります)。イテレータを使用するという考え方は、イテレータを関数に渡すことができ、その関数はその特定の要素からの戻りデータに対して動作するということです。for_each を使用してそれを行う方法がわかりません。私はそれに似た何かをする必要があります:
ありがとう!
c++ - Boost.Variant を使用して一連の境界型を反復処理する方法
v の要素を繰り返し処理して a および b オブジェクトにアクセスするにはどうすればよいですか?
私はboost::getでそれを行うことができますが、構文は本当に面倒です.:
訪問テクニックを使用しようとしましたが、あまりうまくいかず、コードが機能していません:
編集1
ハックな解決策は次のとおりです。