web-dev-qa-db-ja.com

どのBoost機能がC ++ 11と重複していますか?

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

現在、C++ 11があります。私の理解では、C++ 11は多くのBoost機能と重複しています。

これらのオーバーラップが存在する要約、レガシーになるブーストライブラリ、ブースト機能の代わりに使用するC++ 11機能の推奨事項、および推奨しないものはありますか?

185
user377178

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

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

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

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

標準チームはまだ作業中です。

MPL の大部分は、可変長テンプレートを使用して削除または削除できます。 レキシカルキャスト の一般的な使用例は、std :: to_stringとstd :: stoで置き換えることができますバツ

BoostライブラリにはC++ 11に関連するものがありますが、いくつかの拡張機能もあります。 Boost.Functional/Hash に含まれる hash_combine およびC++ 11にはない関連関数、 Boost.Chrono にはI/Oと丸めがあり、他のクロックなどがありますので、実際にそれらを閉じる前に、ブーストを見てみたいことがあります。

278
kennytm

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

はい、代わりにstd::type_traitsregexshared_ptrunique_ptrTuple<>std::tiestd::beginを使用できるはずですBoost Typetraits/Utility、Boost Smartpointer、Boost Tuple、Boost Rangeライブラリがありますが、実際にコードをc ++ 11に移動しない限り、実際に「切り替える」必要はありません。

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

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

     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ユーティリティ(boost::result_of<>および関連)
  • Foreachのブースト(BOOST_FOREACH)
  • 忘れないでください:Boost Move-Boost 1_48 +およびC++ 11コンパイラーを備えたC++ 03コンパイラーで同等にコンパイルできる構文でムーブセマンティクスを持つクラスを作成できます。

ちょうど私の0.02ドル

54
sehe