boost.anyライブラリを使用する利点は何ですか?実際の人生の例を教えてください。オブジェクトの階層のルートにいくつかのジェネリック型を持ち、その基本型を持つコンテナを作成すると、同じ機能を達成できないのはなぜですか?boostの任意のライブラリの典型的な使用法は何ですか?
答えて
Boost.Variantは、非侵入型であり、非常に構造化されたプログラミングを必要とするため、常に優先されるべきだと考えます。
しかし、私はboost.anyの背後にある主な考え方は、javaとc#オブジェクト型に相当するものを提供することだと思います。それは「はい、できます」という言い方です! :-)
boost :: anyは、明らかに基底クラスを持たない型intsと浮動小数点数を格納します。あなたがそれを使うことができる実際の例は、高レベルのインタプリタ言語用の仮想マシンです。あなたの "関数"オブジェクトは引数の配列を必要とします。これは、背後でstd::list<boost::any>
で簡単に実装できます。
なぜオブジェクトの階層のルートにいくつかのジェネリック型を持ち、その基本型のコンテナを作成すると、同じ機能を達成できませんでしたか?
これは、オブジェクト階層 - 周辺機器の問題を解決するためのデザインに人為的に注入するコンストラクトを呼び出します。さらに、このような構成は間違っていることが容易であり、間違った実装が混乱を招く可能性がある。 Boost.Any
はです。コミュニティが安全で十分にテストされた代替案をレビューしました。
実生活の例を教えてください。
TinyJSONはboost.Any
を使用します。
boost.anyライブラリを使用する利点は何ですか?
私はintroductoryのドキュメントを参照しています。
JSONをC++で表現するには、boost :: variant
私はそのライブラリを書いていません:-)あなたは正当な理由があると確信しています。 – dirkgently
タイプセーフなタグ付きバリデーションコンテナのキャリアタイプとしてboost.anyを使用します。その意味は次のとおりです。
私たちは、一連のフィルタを通過する「筏」オブジェクトを持っています。 ETag1
とETag2
は、列挙型のメンバーである、と私たちは種類にタグをマップするために特性のテンプレートを使用し
raft.addTaggedData<ETag1>(3.0);
raft.addTaggedData<ETag2>("a string")`;
std::string str = raft.getTaggedData<ETag2>();
int a = raft.getTaggedData<ETag1>(); // <-- Compile error
:フィルタがいかだにデータを追加したい場合は、このような何かを行うことができます。
のpair<ETagType, boost::any>
をバッキングストアとして使用しています。 Boost.anyは、さまざまな種類のバッファの管理に苦労していました。
boost.MPLのビットを使用すると、Boost.Anyの代わりにboost.Variantを使用できます。 –
boost.anyを使用しても少しのストレッチがありました。私のチームは、C++の機能については控えめです。さらに、私はまだMPLを学んでいない。 :) –
@BenoîtBoost.Variantは、可能なすべてのタグ(または少なくともそれらの値のタイプ)を知るためにラフトを必要とします。たとえば、ラフトが、このような種類のプライベートデータを格納する独立したモジュールを介して浮動している場合、これは可能ではない可能性があります。あるいは可能であれば、このように暗黙のソース依存性があるため望ましくないかもしれません。 Boost.Anyはランタイムコストを増加させるので、トレードオフです。 –
これをプロパティマップ(std::map<std::string, boost::any>
)で使用して、シンプルでフラットなデータスペースに多くのものを動的に格納しました。
ほとんどの場合、スマートptrからスクリプト可能なオブジェクトまたは文字列が格納されていましたが、他のタイプ(浮動小数点、vec3f、行列、およびその他の非標準オブジェクト)が格納されています。
これは、C++にもっとダイナミックな機能を追加する場合や、オブジェクトに任意のタイプのデータを追加するだけのタイプ消去が必要な場合にはうまく機能します。
私がBoost'sについて最初に学んだとき、Dobbs博士のHerb SutterとJim Hyslopによってthis articleが見つかりました。私はそれが役に立ちました。
- 1. LXCとVMの典型的な使用例は何ですか?
- 2. 任意のBoostライブラリを使った奇妙なNDKコンパイル
- 3. MongoDBの典型的な使用
- 4. RabbitMQの典型的なバージョン管理戦略は何ですか?
- 5. 典型的なアンドロイドアプリのプッシュ通知実装は何ですか?
- 6. boost ::任意のデストラクタクラッシュ
- 7. Qtプロパティシステムを使用する典型的なシナリオは何ですか
- 8. boost ::任意の比較値ですか?
- 9. 典型的なFortranプログラムのmacportsからのATLAS/Lapackの使用
- 10. SSDの「典型的な」待ち時間はどういう意味ですか?
- 11. トランスポートRabbitMQでRebusを使用する場合のリモートプロシージャコールの典型的な実装は何ですか?
- 12. 古典的なコンパイラでstd :: atomicやboost :: atomicを使用するには?
- 13. boost ::不正なアクセスにつながる任意の型の変更
- 14. Windows Phoneの広告ID文字列の形式は何ですか?典型的な長さは何ですか?
- 15. 典型的なRedisのはこのような何かを行く例をチャット
- 16. データセンター内のWCF wsHttpBinding - 典型的な使用パターン
- 17. 典型的なAngularJSのワークフローとプロジェクト構造(Python Flaskを使用)
- 18. 典型的なシングルブランチgitワークフロー
- 19. boost :: char []を持つ任意のマップ
- 20. Webクローラの典型的な公平性の要素ですか?
- 21. ASPの古典的なJavaScriptでのCコードの使用方法
- 22. 典型的なUnicodeのエラー:アトム
- 23. 典型的なベストプラクティスのClearCaseプロジェクト構造
- 24. IARプロジェクトの典型的なgitignoreファイル
- 25. .jinitは()私は典型的なメッセージ
- 26. 基本的なサウンド生成/合成ライブラリ、任意の言語
- 27. Delphi - NXライブラリの任意の長整数型?
- 28. Stateモナドを使用した典型的な関数でputコマンドは何をしますか?
- 29. boost :: numpy :: from_dataをboost-numpyライブラリで使用する方法
- 30. ハスケルの任意の型?
実行時に保持する型が分かっている場合、Boost.VariantはBoost.Anyを置き換えることができません。たとえば、SCFrenchのコメントで参照されているリンクを参照してください:http://www.ddj.com/cpp/184403808 –
-1。 Boost.anyは、すべての型、たとえプリミティブなものであっても、C#/ javaの "object"に相当するものではありません。 – Macke
@Mackeこの場合はC#/ javaとは言わないでください。 C#(CLR)はプリミティブ値をオブジェクトに格納できます。言語は同じように見えるかもしれませんが、それらは異なっています。 – erikkallen