Какие функции Boost перекрываются с C ++ 11? - PullRequest
184 голосов
/ 13 января 2012

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

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

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

Ответы [ 2 ]

278 голосов
/ 13 января 2012

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

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

Функции, перенесенные из C ++ 11:

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

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

Большая часть MPL может быть обрезана или удалена с помощью variadicшаблоны.Некоторые распространенные случаи использования Lexical cast могут быть заменены на std :: to_string и std :: sto X .

Некоторые библиотеки Boost связаны с C ++ 11но также имеют некоторые дополнительные расширения, например, Boost.Functional / Hash содержит hash_combine и связанные функции, которых нет в C ++ 11, Boost.Chrono имеет I /О, округление и многие другие часы и т. Д., Так что вы, возможно, все же захотите взглянуть на бустовые, прежде чем действительно их отклонить.

54 голосов
/ 13 января 2012

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

Да, вы должны иметь возможность использовать std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::begin вместо Boost Typetraits / Utility, Boost Smartpointer, Boost Tuple , Библиотеки Boost Range, но на практике не должно быть никакой необходимости «переключаться», если вы не перемещаете больше своего кода на c ++ 11.

Кроме того, по моему опыту, версии std большинства из них несколько менее функциональны. Например. AFAICT стандарт не имеет

  • регулярные выражения Perl5
  • 1020 * шаблон 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 Utility (boost::result_of<> и связанные с ней)
  • Boost Foreach (BOOST_FOREACH)
  • Не забудьте: Boost Move - который позволяет писать классы с семантикой move с синтаксисом, который одинаково хорошо компилируется на компиляторах C ++ 03 с компиляторами Boost 1_48 + и C ++ 11.

Только мои $ 0,02

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...