哪些Boost功能与C ++ 11重叠?


191

几年前,我把我的C ++技能放在架子上,现在看来,当我再次需要它们时,情况发生了变化。

现在我们有了C ++ 11,我的理解是它与许多Boost功能重叠。

是否存在一些重叠之处的摘要,哪些Boost库将成为传统,推荐使用哪些C ++ 11功能而不是boost功能,以及哪些更好?


4
Boost是最早实现TR1库的之一。由于这是标准版本,因此您应该选择标准版本。现在,Boost.Lambda也已被实际的lambda取代。
Kerrek SB 2012年

6
C ++ 11上的Wikipedia文章对大多数更改进行了很好的总结。
程序员花了

Answers:


285

可替换为C ++ 11语言功能或库

TR1(如果它们是TR1库,则会在文档中进行标记)

从C ++ 11向后移植的功能:

可替换为C ++ 17语言功能:

  • String_ref →std :: string_view
  • 文件系统<文件系统>(文件系统TS)
  • 可选 →std :: optional(库基础TS v1
  • 任意 →std :: any(图书馆基础知识TS v1)
  • 数学/特殊功能<cmath>特殊数学IS),请参见下面的列表
    • Beta功能
    • (法线/关联/球面)勒让德多项式
    • (普通/相关)勒让德多项式
    • Hermite多项式
    • 贝塞尔(J / Y / I / K)函数(Y在C ++中称为Neumann函数)
    • 球形贝塞尔(j / y)函数
    • (第一/第二/第三类)的(不完整/完整)椭圆积分
    • 黎曼zeta函数
    • 指数积分Ei
  • 变体 →std :: variant(P0088R2

标准团队仍在努力:

MPL的大部分可以使用可变参数模板进行修剪或删除。可以使用std :: to_string和std :: sto X代替Lexical cast的一些常见用例。

一些Boost库与C ++ 11相关,但也有更多扩展,例如Boost.Functional / Hash包含hash_combine和C ++ 11中未找到的相关函数,Boost.Chrono具有I / O和舍入以及许多其他时钟,等等,因此您可能仍要先查看一下增强型放大器,然后才能真正将它们消除。



9
请注意,Boost.Lambda(或更确切地说,Boost.Phoenix的lambda)对于多态lambda仍然有用。
Xeo 2012年

2
不错的列表,尽管我不相信它std::unique_ptr是TR1的一部分(因为它需要移动语义)
Nemo 2012年

1
@ildjarn:Boost.Chrono提供了比<chrono>更多的功能。Boost.Exception-仅N2179是相关的。
kennytm 2012年

2
@Nemo:是的。只有std :: tr1 :: shared_ptr是TR1的一部分,而const std :: unique_ptr替换了boost :: scoped_ptr和boost :: scoped_array的用例
kennytm 2012年

55

实际上,我认为Boost库不会成为传统。

是的,你应该能够使用std::type_traitsregexshared_ptrunique_ptrtuple<>std::tiestd::begin而不是加速Typetraits /公用事业,助推智能指针,升压元组,升压范围库,但应该在实践中并不真的需要“开关”,除非你正将越来越多的您的代码到c ++ 11。

另外,以我的经验,其中std大多数版本的功能都不那么出色。例如AFAICT标准并不能

  • Perl5正则表达式
  • call_traits
  • 某些regex接口成员(例如bool boost::basic_regex<>::empty())和其他接口的区别
    • 由于Boost界面与Boost Xpressive完全匹配,因此更多
    • 并与Boost String Algorithms配合使用时效果更好。显然,后者没有标准的对应方法(还好吗?)
  • 与TMP(Boost Fusion)有关的许多事情
  • 基于表达式模板的惰性lambda;它们具有不可避免的好处,因为与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 lambda(具有尾随返回类型,显式捕获和声明的参数)更具吸引力。

另外,Boost扮演着BIG的角色,正是为了促进从C ++ 03到C ++ 11的路径迁移以及集成C ++ 11和C ++ 03代码库。我特别在想

  • 升压自动(BOOST_AUTO)
  • Boost Utility(boost::result_of<>及相关)
  • Boost Foreach(BOOST_FOREACH)
  • 别忘了:Boost Move-可以使用带有可在Boost 1_48 +和C ++ 11编译器的C ++ 03编译器上同样良好地编译的语法的move语义编写类。

我的$ 0.02

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.