Fitur Boost manakah yang tumpang tindih dengan C ++ 11?

191

Saya meletakkan keterampilan C ++ saya di rak beberapa tahun yang lalu dan sepertinya sekarang, ketika saya membutuhkannya lagi, lanskap telah berubah.

Kami telah mendapatkan C ++ 11 sekarang, dan pemahaman saya adalah bahwa ini tumpang tindih dengan banyak fitur Boost.

Apakah ada beberapa ringkasan di mana tumpang tindih itu terletak, yang akan meningkatkan perpustakaan menjadi warisan, rekomendasi yang menggunakan fitur C ++ 11 untuk digunakan alih-alih yang meningkatkan dan yang lebih baik tidak?

pengguna377178
sumber
4
Boost adalah salah satu yang pertama yang mengimplementasikan perpustakaan TR1. Karena itu sekarang dalam standar, Anda harus memilih versi standar. Boost.Lambda juga semacam digantikan oleh lambda yang sebenarnya sekarang.
Kerrek SB
6
The Wikipedia artikel tentang C ++ 11 memiliki ringkasan yang baik dari sebagian besar perubahan.
Beberapa programmer dude

Jawaban:

285

Digantikan oleh fitur bahasa atau pustaka C ++ 11

TR1 (mereka ditandai dalam dokumentasi jika itu adalah perpustakaan TR1)

Fitur yang di-porting dari C ++ 11:

Diganti dengan fitur bahasa C ++ 17:

Tim standar masih mengerjakannya:

Sebagian besar MPL dapat dipangkas atau dihapus menggunakan templat variadic. Beberapa kasus umum penggunaan cast Lexical dapat diganti dengan std :: to_string dan std :: sto X .

Beberapa pustaka Boost terkait dengan C ++ 11 tetapi juga memiliki beberapa ekstensi lagi, misalnya Boost.Functional / Hash berisi hash_combine dan fungsi terkait yang tidak ditemukan di C ++ 11, Boost.Chrono memiliki I / O dan pembulatan dan banyak jam lainnya, dll. jadi Anda mungkin masih ingin melihat yang meningkatkan sebelum benar-benar menolaknya.

kennytm
sumber
1
Tambahkan ke daftar Boost.Chrono , Boost.Exception , dan Boost.Swap .
ildjarn
9
Perhatikan bahwa Boost.Lambda (atau lebih tepatnya, Boost.Phoenix 'lambdas), masih berguna untuk lambdas polimorfik.
Xeo
2
Daftar yang bagus, meskipun saya tidak percaya std::unique_ptradalah bagian dari TR1 (karena ini membutuhkan semantik bergerak)
Nemo
1
@ildjarn: Boost.Chrono menyediakan lebih banyak fungsi daripada <chrono>. Boost.Exception - hanya N2179 yang relevan.
kennytm
2
@Nemo: Ya. Hanya std :: tr1 :: shared_ptr adalah bagian dari TR1, dan const std :: unique_ptr menggantikan kasus penggunaan boost :: scoped_ptr dan boost :: scoped_array
kennytm
55

Sebenarnya, saya tidak berpikir peningkatan perpustakaan akan menjadi warisan.

Ya, Anda harus dapat menggunakan std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie,std::begin bukan Typetraits Meningkatkan / Utility, Meningkatkan Smartpointer, Meningkatkan Tuple, Meningkatkan Rentang perpustakaan, tapi harus dalam prakteknya tidak ada kebutuhan nyata untuk 'switch' kecuali Anda bergerak lebih dari kode Anda ke c ++ 11.

Juga, dalam pengalaman saya, stdsebagian besar versi ini agak kurang fitur. Misalnya AFAICT yang standar tidak miliki

  • Perl5 ekspresi reguler
  • call_traits
  • Anggota antarmuka regex tertentu (seperti bool boost::basic_regex<>::empty()) dan perbedaan antarmuka lainnya
    • ini menggigit lebih karena antarmuka Boost sangat cocok dengan Boost Xpressive
    • dan itu bermain jauh lebih baik dengan Algoritma String Peningkatan Jelas, yang terakhir tidak memiliki rekan standar (belum?)
  • Banyak hal yang berkaitan dengan TMP (Boost Fusion)
  • Malas, lambdas berbasis template ekspresi; mereka memiliki manfaat yang tak terhindarkan karena mereka bisa menjadi polimorfik saat ini , dibandingkan dengan C ++ 11. Karena itu mereka sering kali lebih ringkas:

     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);

    Yang paling pasti, ini masih memiliki beberapa daya tarik atas lambda C ++ 11 (dengan tipe trailing return, penangkapan eksplisit dan parameter yang dinyatakan).

Juga, ada peran BESAR untuk Peningkatan, tepatnya dalam memfasilitasi migrasi jalur-bijaksana dari C ++ 03 ke C ++ 11 dan mengintegrasikan basis kode C ++ 11 dan C ++ 03. Saya terutama memikirkan

  • Tingkatkan Otomatis (BOOST_AUTO)
  • Boost Utility ( boost::result_of<>dan terkait)
  • Tingkatkan Foreach (BOOST_FOREACH)
  • Jangan lupa: Boost Move - yang memungkinkan untuk menulis kelas dengan memindahkan semantik dengan sintaks yang akan mengkompilasi sama baiknya pada kompiler C ++ 03 dengan komposer Boost 1_48 + dan C ++ 11.

Hanya $ 0,02 saya

lihat
sumber