28

Boostアレイのドキュメントを読んでいて、次の行が表示されます。

C ++ 11を使用している場合は、boost::arrayの代わりにstd::arrayの使用を検討する必要があります

私は、Boostは、その主要なライブラリとして、標準のライブラリよりも常に好ましいという印象を受けました。

  • ブーストは、標準のライブラリよりもパフォーマンスが低下することはありません
  • ブーストはより多くの機能を提供する可能性があります
  • ブーストはついに標準ライブラリと同等の品質になりました(C ++標準を作成する人々はアクティブなブースト開発者/スーパーバイザーです)
  • 主要なブースト機能は、数年後に標準ライブラリに組み込まれます

だから私はstdlibよりもブーストを好むのは正しいですか?

そうでない/より複雑な場合、私の仮定のどれを修正する必要がありますか?

4

5 に答える 5

27

利用可能な場合は標準ライブラリを使用する必要があると思います。これは標準であり、コンパイラに付属しているためです。さらに、ブーストを使用する場合は、煩わしい外部依存関係が必要です。

ですから、私のアドバイスは次のとおりです。可能な場合はstdを使用してください。古いコンパイラでコンパイルする必要があるポータブルコードを作成している場合は、使用しているコンパイラに応じてstdまたはboost名前空間を埋め込む独自の名前空間(例:cxx0x)の使用を検討できます(これは名前空間エイリアスと呼ばれます)。 )::

#ifdef COMPILER_HAS_CXX0X
    #include <memory>
    namespace cxx0x = std;
#else
    #include <boost/shared_ptr.hpp>
    namespace cxx0x = boost;
#endif

...

cxx0x::shared_ptr< MyClass > = ...
于 2013-01-15T09:57:06.140 に答える
4

Boostの人々自身からの引用:

組織がBoostを使用する必要があるのはなぜですか?

一言で言えば、生産性。Boostのような高品質のライブラリを使用すると、初期開発がスピードアップし、バグが減り、車輪の再発明が減り、長期的なメンテナンスコストが削減されます。また、Boostライブラリは事実上の標準または正当な標準になる傾向があるため、多くのプログラマーはすでにそれらに精通しています。

Boostライブラリのうち10個はC++標準ライブラリのTR1に含まれているため、後で完全に標準化する予定です。より多くのBoostライブラリがTR2のパイプラインにあります。Boostライブラリを使用することで、組織は新しいテクノロジーを採用する上で有利なスタートを切ることができます。

多くの組織は、Adobe Acrobat Reader 7.0など、Boostで実装されたプログラムをすでに使用しています。

于 2013-01-15T09:53:05.630 に答える
2

私自身の経験から、今のところブーストを使用することを好みます。歴史的なことかもしれませんが、VC2008に付属するTR1でのSTDの試みにはバグが多すぎることがわかりました。PJプラウガーの最善の努力にもかかわらず、彼はピアレビューおよびチェックされたブーストのコードの品質を再現できませんでした。かなりの歴史。

彼らが実際にブーストコードを取得してSTDで使用できない限り、なぜ彼らはそれをより良く再現するのでしょうか?もちろん、時には彼らはそうするかもしれません、そして実際には彼らはお互いに反対するのではなく、一緒に取り組むべきです。

私が今していることの1つは、エイリアス名前空間を宣言することです。これは通常、次のように呼ばれspnsます。

namespace spns = boost;

その後spns::shared_ptr、コード全体で使用でき(spnsは「共有ポインター名前空間」を表します)、後でstdに変更した場合は、1つの場所に移動して、その行とインクルードだけを編集するのは簡単です。

C ++ 11に関しては、標準に大きな変更があり、boostのコードはC++03です。そのため、ライブラリの特定の部分のテーブルが変わる可能性があります。Boostの優れたライブラリのいくつかはC++11でほとんど時代遅れになると思います。たとえば、誰もboost::lambdaもう使用せず、ラムダに新しい言語構文を使用するだけです。

そうです、C ++ 11に移行するときは、Boostライブラリの一部を放棄して新しいバージョンを使用する時期かもしれません。

于 2013-01-15T10:03:25.017 に答える
1

C ++ 11に対して開発されたオープンソースソフトウェアで私が見た傾向は、API互換(サブセット)機能をSTDからブーストに移動することです-ブーストは、std機能がある非C++11互換コンパイラで利用できるためです(明らかに)そうではありません。

この良い例はmoshです。

API互換機能の場合、名前空間を切り替えるだけです。実際、可能であれば、それを構成オプションにしない理由はありません。

補足:ヘッダーのみではないBoostライブラリの最新バージョンとリンクしている場合は、Boostがでコンパイルされていない限り、特定の機能が使用できなくなることに注意して-std=c++11ください。boost::filesystem私は最近、 APIの特定の関数でこれに遭遇しました。

于 2013-01-15T10:08:35.623 に答える
1

何かが標準になり得るなら、それを標準にしましょう。何かができない場合は、可能な限り標準的なソリューションを使用してください(BOOSTはそのために設計されています)

多くの標準ライブラリ機能はブーストから取得され、それらの機能がまだ標準化されていないときに展開されたアプリケーションをサポートするために存在し続けます。

標準化された機能にブーストを使用することは、実際には「振り返る」ことです。必要な場合もあります(標準ライブラリ固有の実装に必要なものがすべて含まれていない場合があります...一部のコンパイラではstd実装がまだ移植されていないため、Windowsではstd::threadではなくboost::threadが表示されるのが一般的です)しかし、私はそれをルールにしません。

于 2013-01-15T10:14:24.790 に答える