2009-04-23 14 views

答えて

6

Boost.Variantは、非侵入型であり、非常に構造化されたプログラミングを必要とするため、常に優先されるべきだと考えます。

しかし、私はboost.anyの背後にある主な考え方は、javaとc#オブジェクト型に相当するものを提供することだと思います。それは「はい、できます」という言い方です! :-)

+4

実行時に保持する型が分かっている場合、Boost.VariantはBoost.Anyを置き換えることができません。たとえば、SCFrenchのコメントで参照されているリンクを参照してください:http://www.ddj.com/cpp/184403808 –

+0

-1。 Boost.anyは、すべての型、たとえプリミティブなものであっても、C#/ javaの "object"に相当するものではありません。 – Macke

+0

@Mackeこの場合はC#/ javaとは言わないでください。 C#(CLR)はプリミティブ値をオブジェクトに格納できます。言語は同じように見えるかもしれませんが、それらは異なっています。 – erikkallen

21

boost :: anyは、明らかに基底クラスを持たない型intsと浮動小数点数を格納します。あなたがそれを使うことができる実際の例は、高レベルのインタプリタ言語用の仮想マシンです。あなたの "関数"オブジェクトは引数の配列を必要とします。これは、背後でstd::list<boost::any>で簡単に実装できます。

3

なぜオブジェクトの階層のルートにいくつかのジェネリック型を持ち、その基本型のコンテナを作成すると、同じ機能を達成できませんでしたか?

これは、オブジェクト階層 - 周辺機器の問題を解決するためのデザインに人為的に注入するコンストラクトを呼び出します。さらに、このような構成は間違っていることが容易であり、間違った実装が混乱を招く可能性がある。 Boost.Anyです。コミュニティが安全で十分にテストされた代替案をレビューしました。

実生活の例を教えてください。

TinyJSONboost.Anyを使用します。

boost.anyライブラリを使用する利点は何ですか?

私はintroductoryのドキュメントを参照しています。

+4

JSONをC++で表現するには、boost :: variant が私の意見では良い選択です。 –

+1

私はそのライブラリを書いていません:-)あなたは正当な理由があると確信しています。 – dirkgently

2

タイプセーフなタグ付きバリデーションコンテナのキャリアタイプとしてboost.anyを使用します。その意味は次のとおりです。

私たちは、一連のフィルタを通過する「筏」オブジェクトを持っています。 ETag1ETag2は、列挙型のメンバーである、と私たちは種類にタグをマップするために特性のテンプレートを使用し

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は、さまざまな種類のバッファの管理に苦労していました。

+0

boost.MPLのビットを使用すると、Boost.Anyの代わりにboost.Variantを使用できます。 –

+0

boost.anyを使用しても少しのストレッチがありました。私のチームは、C++の機能については控えめです。さらに、私はまだMPLを学んでいない。 :) –

+0

@BenoîtBoost.Variantは、可能なすべてのタグ(または少なくともそれらの値のタイプ)を知るためにラフトを必要とします。たとえば、ラフトが、このような種類のプライベートデータを格納する独立したモジュールを介して浮動している場合、これは可能ではない可能性があります。あるいは可能であれば、このように暗黙のソース依存性があるため望ましくないかもしれません。 Boost.Anyはランタイムコストを増加させるので、トレードオフです。 –

3

これをプロパティマップ(std::map<std::string, boost::any>)で使用して、シンプルでフラットなデータスペースに多くのものを動的に格納しました。

ほとんどの場合、スマートptrからスクリプト可能なオブジェクトまたは文字列が格納されていましたが、他のタイプ(浮動小数点、vec3f、行列、およびその他の非標準オブジェクト)が格納されています。

これは、C++にもっとダイナミックな機能を追加する場合や、オブジェクトに任意のタイプのデータを追加するだけのタイプ消去が必要な場合にはうまく機能します。

5

私がBoost'sについて最初に学んだとき、Dobbs博士のHerb SutterとJim Hyslopによってthis articleが見つかりました。私はそれが役に立ちました。

関連する問題