このサイトを使い始めてから、Boost ライブラリについてよく耳にします。Boost ライブラリの主な利点 (したがって、なぜ使用する必要があるのか) と、Boost ライブラリの移植性について疑問に思っています。
12 に答える
Boost は、標準委員会の複数のメンバーによって組織されています。
したがって、次の標準に含まれるライブラリの繁殖地です。
- これは STL の拡張です (省略されたビットを埋めます)。
- それは十分に文書化されています。
- よく査読されています。
- 活動が活発であるため、バグはすぐに発見され、修正されます。
- プラットフォームに依存せず、どこでも機能します。
- ご利用は無料です。
tr1 が間もなく登場するので、Boost がすでに多くの領域をカバーしていることを知ってうれしいです。tr1 の多くのライブラリは、基本的にはブーストのオリジナルから直接適応されているため、試行およびテストされています。違いは、(boost ではなく) std::tr1 名前空間に移動されたことです。
あなたがする必要があるのは、コンパイラのデフォルトのインクルード検索パスに以下を追加することだけです:
<boost-install-path>/boost/tr1/tr1
次に、標準ヘッダーを含めると、ブーストは必要なものをすべて名前空間 std::tr1 に自動的にインポートします
例えば:
std::tr1::share_ptr を使用するには、<memory> を含めるだけです。これにより、1 つのファイルですべてのスマート ポインターが得られます。
Boost の背景情報ページを読むだけで、 Boostを使用する理由と、Boost を使用できる目的の概要を簡単に知ることができます。数分かかるだけの価値があります。
99% ポータブル。
ブーストによって解決されるニーズを発見すると、本当に役立つライブラリがかなりあると思います。自分でコーディングするか、非常に堅実なライブラリを使用します。Multi-Index、Lambda、Program Options、RegEx、SmartPtr、Tuple などの既製のソースがあるのは素晴らしいことです...
最良の方法は、時間をかけてさまざまなライブラリのドキュメントを読み、それが役に立つかどうかを評価することです。
価値がある!!
Boostは素晴らしいですが、ここでDevil's Advocateをプレイするだけで、Boostを使用したくない理由がいくつかあります。
- 古いコンパイラで正しくコンパイル/動作しない場合があります。
- 多くの場合、テンプレートを多用しないアプローチよりもコンパイル時間が長くなります。
- 一部のBoostコードは、思ったとおりに動作しない場合があります。ドキュメントを読んでください!
- テンプレートを乱用すると、読み取り不能なエラーメッセージが表示される可能性があります。
- テンプレートを悪用すると、デバッガーでコードをステップスルーするのが困難になる可能性があります。
- 最先端のC++です。Boostの次のバージョンは、現在の(古い)コンパイラでコンパイルできなくなる可能性があります。
これはすべて、Boostをそのまま使用しなくても、Boostコードを見て自分でアイデアを得る必要がないという意味ではありません。
C++0x で提供される多くの機能を利用できます。しかし、その一般性は別として、より優れた仕様のいくつかは、単純な正規表現ライブラリ、文字列から int へのキャスト (レキシカル キャスト)用のキャスト ライブラリです。
int iResult = 0;
try
{
iResult = lexical_cast<int>("4");
}
catch(bad_lexical_cast &)
{
cout << "Unable to cast string to int";
}
日付/時刻ライブラリなど...
using namespace boost::gregorian;
date weekstart(2002,Feb,1);
date thursday_next = next_weekday(weekstart, Thursday); // following Thursday
Python インターフェイス(Boost Python)、レクサー/パーサー DSL (Boost Spirit)もあります。
// A grammar in C++ for equations
group = '(' >> expression >> ')';
factor = integer | group;
term = factor >> *(('*' >> factor) | ('/' >> factor));
expression = term >> *(('+' >> term) | ('-' >> term));
そして、それは表面をなぞっただけです...
Boost は C++ ライブラリのコレクションです。そのうち 10 個は C++0x の tr1 に含まれています。
ここでブーストを開始できます。
Boostは、移植性と正確性に重点を置いた、ピア レビューされた高品質の C++ ライブラリのコレクションです。これは、言語と標準ライブラリに新たに追加するための事実上の証明の根拠として機能します。詳細については、彼らのウェブサイトをご覧ください。
Boost の利点: 広く利用可能で、最新の C++ コンパイラやあらゆるプラットフォームに移植できます。
関数はプラットフォームに依存しないため、新しいフレームワークごとに新しいスレッド設計を学ぶ必要はありません。
標準的な方法でファイルシステムなど、多くのプラットフォーム固有の機能をカプセル化します。
これは、C++ に同梱されているはずのものです。Java の人気の多くは、標準ライブラリに同梱されていて、ほとんどすべてのことを実行できることでした。残念ながら、C++ は限られた C/Unix 標準関数しか継承していません。
shared_ptr
とweak_ptr
、特にマルチスレッド コードでは、boost をインストールするだけの価値があります。 BOOST_STATIC_ASSERT
コンパイル時のロジックチェックを行うのにも非常に優れています。
ブーストの多くのクラスとユーティリティがヘッダーにあるという事実は、何もコンパイルしなくても多くの機能を取得できることを意味することもプラスです. 非常に古いコンパイラを使用しない限り、通常、移植性は問題になりません。MPL を VC6 で動作させようとしたことがありますが、完全に爆発する前に 40,000 件の警告/内部エラーが出力されました。ただし、一般に、ほとんどのライブラリは、プラットフォームやコンパイラ ベンダーに関係なく動作するはずです。
Boost のかなりの数のものが既に TR1 に含まれており、C++ 標準ライブラリの次のリビジョンに含まれる可能性が高いという事実を考慮してください。かなりの大賛成です。
Boost は、ほとんどすべてのアプリケーションで役立つ (通常は) ジェネリック コンストラクトの非常に広範なライブラリです。これは、多くのブースト コンポーネントが C++ 0x 仕様に含まれているという事実によって示されます。
また、少なくとも主要なプラットフォーム間で移植可能であり、ほぼ標準に準拠した C++ コンパイラを使用して、ほぼすべてのものに移植できるはずです。
唯一の警告は、boost ライブラリ間に多くの依存関係が混在している可能性があり、配布する特定のコンポーネント (boost ライブラリ全体以外) を選択するのが難しくなる可能性があることです。
上記のすべてに加えて、多くの最新のベスト プラクティス C++ 手法が奨励されます。コードの品質を向上させる傾向があります。
また、ブーストのほとんどはテンプレートであるため、ビルドする必要はありません
(正しいヘッダーファイルをインクルードするだけです)。
ビルドが必要ないくつかのパーツはオプションです。
これらはそれぞれ独立してビルドできるため、不要なコードの不要な肥大化を防ぐことができます。