Какие функции Boost перекрываются с C ++ 11?


192

Я положил свои навыки C ++ на полку несколько лет назад, и теперь, когда они мне снова нужны, ситуация изменилась.

Сейчас у нас есть C ++ 11, и я понимаю, что он перекрывает многие функции Boost.

Есть ли какая-то сводка, где лежат эти перекрытия, какие библиотеки Boost станут унаследованными, рекомендации, какие функции C ++ 11 следует использовать вместо расширенных, а какие лучше нет?


4
Boost был одним из первых, кто внедрил библиотеку TR1. Так как это сейчас в стандарте, вы должны предпочесть стандартную версию. Boost.Lambda теперь также заменяется на настоящие лямбды.
Kerrek SB

6
Википедия статья на C ++ 11 имеет хорошее резюме большинство изменений.
Какой-то программист чувак

Ответы:


286

Заменяемые языком C ++ 11 функции или библиотеки

TR1 (они отмечены в документации, если это библиотеки TR1)

Особенности, перенесенные из C ++ 11:

Заменяемые на C ++ 17 языковых особенностей:

  • String_ref → std :: string_view
  • Filesystem<файловая система> (Filesystem TS)
  • Необязательно → STD :: Необязательно ( Основы библиотеки TS v1 )
  • Любая → std :: любая (Библиотека Основ TS v1)
  • Математика / Специальные функции<cmath>( Special Math IS ), см. Список ниже
    • бета-функция
    • (нормальные / связанные / сферические) полиномы Лежандра
    • (нормальный / ассоциированный) полиномы Лежандра
    • Эрмитовых полиномов
    • Функции Бесселя (J / Y / I / K) (Y называется функцией Неймана в C ++)
    • сферические функции Бесселя (Дж / У)
    • (неполные / полные) эллиптические интегралы (первого / второго / третьего рода)
    • Дзета-функция Римана
    • экспоненциальный интеграл Ei
  • Вариант → STD :: вариант ( P0088R2 )

Стандартная команда все еще работает над этим:

Большая часть 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) по-прежнему полезны для полиморфных лямбд.
Xeo

2
Хороший список, хотя я не верю, что он std::unique_ptrявляется частью TR1 (так как он требует семантики перемещения)
Nemo

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

56

На самом деле, я не думаю, что библиотеки повышения станут наследием.

Да, вы должны быть в состоянии использовать std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::beginвместо повышающего TypeTraits / Utility, увеличить умный указатель, увеличить кортеж Повысьте библиотеки Range, но на практике не должна быть никакой реальной необходимостью «ключ» , если вы не двигаетесь больше твой код на с ++ 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_AUTO)
  • Повышение полезности ( boost::result_of<>и связанные)
  • Повысить Foreach (BOOST_FOREACH)
  • Не забывайте: Boost Move - который позволяет писать классы с семантикой move с синтаксисом, который одинаково хорошо компилируется на компиляторах C ++ 03 с компиляторами Boost 1_48 + и C ++ 11.

Просто мои 0,02 доллара

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.