Які функції Boost перекриваються C ++ 11?


191

Я поставив свої навички C ++ на полиці кілька років тому, і, здається, зараз, коли мені вони знову потрібні, пейзаж змінився.

Зараз у нас є C ++ 11, і я розумію, що він перекриває багато функцій Boost.

Чи є якийсь підсумок, де лежать ті дублювання, які збільшать бібліотеки Boost, які рекомендують використовувати функції C ++ 11 замість прискорених, а які - ні?


4
Boost був одним із перших, хто впровадив бібліотеку TR1. Оскільки це зараз у стандарті, вам слід віддати перевагу стандартній версії. Зараз Boost.Lambda також замінений фактичними лямбдами.
Керрек СБ

6
У статті Вікіпедії на C ++ 11 є хороший підсумок більшості змін.
Якийсь програміст чувак

Відповіді:


285

Замінюється C ++ 11 мовними функціями або бібліотеками

TR1 (вони позначені в документації, якщо це бібліотеки TR1)

Функції, що переносяться з C ++ 11:

Мовна функція, що замінюється C ++ 17 мовами:

Стандартний колектив все ще працює над цим:

Значну частину MPL можна обрізати або видалити за допомогою різних шаблонів. У деяких випадках спільне використання лексичної гіпсі можна замінити станд :: to_string і станд :: STO X .

Деякі бібліотеки Boost пов'язані з C ++ 11, але також мають деякі інші розширення, наприклад, Boost.Functional / Hash містить hash_combine та пов'язані з ними функції, які не зустрічаються в C ++ 11, Boost.Chrono має введення / виведення та округлення та багато інших годин, і т. д., тож ви все ще можете поглянути на підсилювальних, перш ніж реально відхилити їх.


1
Додайте до списку Boost.Chrono , Boost.Exception та Boost.Swap .
ildjarn

9
Зауважте, що лямбда Boost.Lambda (вірніше, лямбда Boost.Phoenix), як і раніше корисна для поліморфних лямбда.
Ксео

2
Хороший список, хоча я не вірю, що він std::unique_ptrє частиною TR1 (оскільки для цього потрібна семантика переміщення)
Немо,

1
@ildjarn: Boost.Chrono забезпечує набагато більше функцій, ніж <chrono>. Boost.Exception - актуально лише N2179.
kennytm

2
@Nemo: Так. Тільки std :: tr1 :: shared_ptr є частиною TR1, а const std :: unique_ptr замінює випадки використання boost :: scoped_ptr і boost :: scoped_array
kennytm

55

Насправді, я не думаю, що розширені бібліотеки стануть спадщиною.

Так, ви повинні бути в змозі використати std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie,std::begin замість підвищує TypeTraits / Utility, збільшити розумний покажчик, збільшити кортеж Підвищіть бібліотеки Range, але на практиці не повинна бути ніякої реальної необхідністю «ключ» , якщо ви не рухаєтеся більше ваш код на c ++ 11.

Також, на мій досвід, stdверсії більшості з них дещо менш характерні. Наприклад, AFAICT стандарт не має

  • Perl5 регулярні вирази
  • call_traits
  • Деякі члени інтерфейсу регулярних виразів (наприклад, bool boost::basic_regex<>::empty() ) та інші інтерфейсні відмінності
    • це кусає більше, оскільки інтерфейс Boost точно збігається з Boost Xpressive
    • і це грає набагато приємніше з алгоритмами Boost String. Очевидно, що останні не мають стандартних аналогів (ще?)
  • Багато речей, що стосуються 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 лямбда (із задніми типами повернення, явними захопленнями та оголошеними параметрами).

Крім того, існує велика роль для Boost, саме в тому, щоб полегшити міграцію шляху з C ++ 03 на C ++ 11 та інтегрувати бази C ++ 11 і C ++ 03. Я особливо думаю про це

  • Автоматичне підвищення (BOOST_AUTO)
  • Підвищити утиліту ( boost::result_of<>та пов'язані з нею)
  • Збільшити Foreach (BOOST_FOREACH)
  • Не забувайте: Boost Move - що дозволяє писати класи з семантикою переміщення із синтаксисом, який однаково добре складатиметься на компіляторах C ++ 03 із компіляторами Boost 1_48 + та C ++ 11.

Тільки мої 0,02 долара

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.