C ++ 11と重複するBoost機能はどれですか?


191

私はC ++のスキルを数年前に棚に置いていましたが、今は再び必要になったときに状況が変わったようです。

C ++ 11を手に入れました。私の理解では、多くのBoost機能と重複しています。

それらの重複が存在するいくつかの概要はありますか?Boostライブラリはレガシーになるでしょう、Boostの代わりにどのC ++ 11機能を使用するべきか、どちらを使用しない方が良いか、という推奨はありますか?


4
Boostは、TR1ライブラリを実装した最初の1つです。これは現在標準になっているので、標準バージョンを優先する必要があります。Boost.Lambdaも実際には実際のラムダに置き換えられています。
Kerrek SB、2012

6
ウィキペディアの C ++ 11の記事は、ほとんど変化の良い要約を持っています。
一部のプログラマー

回答:


285

C ++ 11言語機能またはライブラリで置き換え可能

TR1(それらはTR1ライブラリの場合、ドキュメントでマークされています)

C ++ 11からバックポートされた機能:

C ++ 17言語機能で置き換え可能:

標準チームはまだそれに取り組んでいます:

MPLの大部分は、可変テンプレートを使用して削減または削除できます。レキシカルキャストのいくつかの一般的な使用例は、std :: to_stringおよびstd :: sto Xに置き換えることができます。

一部のBoostライブラリはC ++ 11に関連していますが、いくつかの拡張機能もあります。たとえば、Boost.Functional / HashにはC ++ 11にはないhash_combineおよび関連関数が含まれ、Boost.ChronoにはI / Oと丸め、およびその他の多くのクロックがあります。など、そのため、実際にそれらを却下する前に、引き続きブーストを確認したい場合があります。


1
リストにBoost.ChronoBoost.Exception、およびBoost.Swapを追加します。
ildjarn 2012年

9
Boost.Lambda(または、Boost.Phoenixのラムダ)は、ポリモーフィックラムダに対しても有用です。
Xeo

2
素晴らしいリストですが、私はstd::unique_ptrTR1の一部であるとは思いません(移動のセマンティクスが必要なため)
Nemo

1
@ildjarn:Boost.Chronoは、<chrono>よりもはるかに多くの機能を提供します。Boost.Exception — N​​2179のみが関連します。
kennytm

2
@Nemo:はい。std :: tr1 :: shared_ptrのみがTR1の一部であり、const std :: unique_ptrがboost :: scoped_ptrおよびboost :: scoped_arrayのユースケースを置き換える
kennytm

55

実際、boostライブラリがレガシーになるとは思いません。

はい、あなたは使用することができるはずですstd::type_traitsregexshared_ptrunique_ptrtuple<>std::tiestd::beginあなたがより多くの移動している場合を除き、代わりにブーストTypetraits /ユーティリティのSmartpointerブースト、タプルをブースト、レンジライブラリブーストが、実際には「スイッチ」への本当の必要があってはなりませんコードをc ++ 11に変換します。

また、私の経験ではstd、これらのほとんどのバージョンはあまり機能的ではありません。例えばAFAICT標準ではないではない持っています

  • Perl5正規表現
  • call_traits
  • 特定の正規表現インターフェースメンバー(などbool boost::basic_regex<>::empty())とその他のインターフェースの違い
    • BoostインターフェースはBoost Xpressiveと完全に一致しているため、これはさらに噛みます
    • Boost String Algorithmsを使用すると、はるかにうまく機能します。明らかに、後者には標準の対応物がありません(まだ?)。
  • TMP(Boost Fusion)に関連する多くのこと
  • 遅延、式テンプレートベースのラムダ。それらは、C ++ 11とは対照的に、今日多態性になる可能性あるという点で避けられない利点 があります。したがって、多くの場合、より簡潔にすることができます。

     std::vector<int> v = {1,2,-9,3};
    
     for (auto i : v | filtered(_arg1 >=0))
         std::cout << i << "\n";
    
     // or:
     boost::for_each(v, std::cout << _arg1);

    最も間違いなく、これはまだC ++ 11ラムダよりも魅力的です(後続の戻り値型、明示的なキャプチャー、宣言されたパラメーターがあるため)。

また、C ++ 03からC ++ 11へのパス単位の移行を容易にし、C ++ 11とC ++ 03コードベースを統合するという点で、Boostには大きな役割があります。私は特に考えています

  • 自動ブースト(BOOST_AUTO)
  • ブーストユーティリティ(boost::result_of<>および関連)
  • ブーストForeach(BOOST_FOREACH)
  • 忘れないでください:Boost Move-これは、Boost 1_48 +およびC ++ 11コンパイラーを使用するC ++ 03コンパイラーでも同等にコンパイルされる構文を使用して、移動セマンティクスを持つクラスを作成できるようにします。

たったの0.02ドル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.