2010-11-25 12 views
4

OK、私は私の関数のコードを少しきれいにするために(intdoubleCString) 。boost :: variantロケット科学ですか? (したがって、私は単純な問題のためにそれを避けるべきですか?)

だから私は思う:小さな労働者のようなラッパーstruct 3人のメンバーなどと書くことは問題ありません。待ってください!boost::variantは読んでいませんか?これは私が必要とするものではないでしょうか?これは、自分自身をラッパー構造体で囲むことから私を救うでしょう! (私はすでに私のプロジェクトで利用可能なブーストライブラリを持っていることに注意してください。)

をだから私は、私のブラウザを起動Chapter 28. Boost.VariantとLOにナビゲートして見よ:

バリアントクラステンプレートは、安全で汎用的ですスタックベースの弁別されたユニオンコンテナで、異種のタイプのオブジェクトを操作するための簡単なソリューションを提供します[...]

素晴らしい!正確に私が必要なもの!

しかし、それは上行く:Boost.Any対

Boost.Variant

  • Boost.Anyが潜在的に困難な読み取りを回避テンプレートメタプログラミング技術(のほとんど使用しますエラーメッセージ、重要なコンパイル時プロセッサとメモリ要求)。

[...]

は "内部ヒープリミットに達した"

トラブルシューティング - マイクロソフトのVisual C++ - コンパイラオプションは/ ZmNNNは、メモリ割り当て制限を増やすことができます。 NNNはスケーリングのパーセンテージです(つまり、デフォルトの上限は100です)。 (/ ZM200を試してみてください。)

[...]

あああー。 boost :: variantを使用すると、コンパイル時間が大幅に増加し、読みにくいエラーメッセージが生成される可能性があります。誰かが私のboost :: variantの使用を共通ヘッダーに移すと、私たちのプロジェクトは突然長くコンパイルされるでしょうか? (不必要に)複雑なタイプを導入していますか?

私は私の、単純な小さな問題に対してboost::variantを使用する必要がありますか?

答えて

5

Boost.variantはそれほど複雑ではありません、IMHO。はい、テンプレートベースですが、C++の本当に複雑な機能は使用していません。私はかなり少し使いましたが、全く問題はありません。私はあなたのケースでは、あなたのコードが何をしているのかをよりよく説明するのに役立つと思います。

考え方のもう1つの考え方は、その関数が返すものをより意味の豊かな構造/クラスに変換して、内部要素が面白いと解釈することができますが、それは設計に依存します。

7

一般的に、あなたは判別組合をしたいですか場合boost::variantを使用する(anyは不明なタイプのためである - void*がCで使用される方法と同等のいくつかの種類と考えます)。

いくつかの利点には、例外処理、型サイズの合計よりも少ない領域の潜在的使用法、差別化された「訪問」型が含まれます。基本的には、差別化された組合で実行したいものです。

しかし、boost::variantを効率的に使用するには、使用するタイプの少なくとも1つを「容易に」構築する必要があります(「簡単に」という意味の詳細については、ドキュメントを参照してください)。

+0

どういうわけかこの答えは質問を見逃しているようです。私はブースト・バリアントがその実装/高度な機能のために過剰なものであるかどうか尋ねたと思う。その*意図された*使用は十分に明らかです。 –

+1

どのように過度の判断をしますか?問題は、識別された共用体がどのように使用されるかを指定していません(マルチ型の戻り値用ですが、戻り値はどのように使用されますか?)。それは相対的な質問(回答は現在のプロジェクトのサイズに依存する)であり、基準値に関する情報はないため、不都合である。 – lijie

0

私には悪いデザインの症状なので使用しません。

メソッドは、確定したインターフェイスを実装するオブジェクトを返すか、複数のメソッドで分割する必要があります。とにかく、デザインをレビューする必要があります。

+6

バリアントは悪い設計ではなく、非常に多くのことが必要とされる状況があります。あなたが得るタイプによって、まったく異なるアクションを実行することがあります。 – CashCow

+0

これは私の意見でした。私には、バリアントに頼らざるをえない場合は、ほとんど常にコードデザインを改善する方法があります。 – Simone

+2

C++では、インターフェイスの後ろの違いを隠すことはそれほど大きな改善ではありません。次に、(動的に割り当てられた)ポインタを渡すことに頼る必要があり、実行時の効率が低下します。問題が*これらの3つのタイプ*のうちの1つを返すだけであれば、それはどのように問題であるかわかりません。ユーザーからの入力を解析する関数であるとします。これは、int、doubleまたはその他の文字列を含んでいます。変種タイプは、*私が欲しいと思うように聞こえます。 – jalf

1

このようなブーストエレメントは、関数計算によるもので、どこにでもvariantsがあります。

多くの正確な型の値を返すための型セーフなアプローチが必要です。これはあなたの問題を解決するのに役立つが、本当にあなたがしなければならないことを考えるべきだということを意味する。同じ問題は、型の安全性であるべき解決しようとする他のアプローチに比べ

付加価値(あなたがvoid*に反対して、気づかずバリアントの内側にあなたが望むものは何でも配置することができません)

関連する問題