哪个Boost特性与C ++ 11重叠?

几年前,我把C ++技巧放在架子上,现在看来,当我再次需要它们的时候,风景已经改变了。

我们现在已经有了C ++ 11,我的理解是它重叠了许多Boost特性。

是否有一些总结,其中重叠的谎言,哪些Boost库将成为传统,推荐哪些C ++ 11function使用,而不是提升,哪个更好?

可以用C ++ 11语言特性或库replace

  • Foreach →以范围为基础
  • function/转发 →完美转发( 右值引用 , 可变参数模板和std ::向前 )
  • 就地工厂,就地工厂 →完美转发(至less在文档用例中)
  • Lambda → Lambdaexpression式 (在非多态的情况下)
  • 本地函数 →Lambdaexpression式
  • Min-Max → std :: minmax , std :: minmax_element
  • 比率 → std :: ratio
  • 静态Assert →static_assert
  • 线程 →<线程>等(但检查这个问题 )。
  • Typeof →auto,decltype
  • 初始化值 →列表初始化(§8.5.4/ 3)
  • math/特殊function → <cmath> ,请参阅下面的列表
    • 伽玛函数(tgamma),对数伽马函数(lgamma)
    • 错误函数(erf,erfc)
    • log1pexpm1
    • cbrtcbrt
    • acoshasinhatanh

TR1(如果是TR1库,则在文档中标记)

  • 数组 →std ::数组
  • 绑定 →std :: bind
  • 启用If →std :: enable_if
  • 函数 →std :: function
  • 成员函数 →std :: mem_fn
  • 随机 →<随机>
  • Ref →std :: ref, std :: cref
  • 正则expression式 →<正则expression式>
  • 结果 → std :: result_of
  • 智能Ptr →std :: unique_ptr,std :: shared_ptr,std :: weak_ptr(但boost :: intrusive_ptr仍然不能被replace)
  • 交换 (交换数组)→std :: swap
  • 元组 →std ::元组
  • typestraits →<type_traits>
  • Unordered →<unordered_set>,<unordered_map>

从C ++ 11反向移植的特性:

  • primefaces ←标准::primefaces
  • Chrono ←<chrono>(见下文)
  • 移动 ←Rvalue引用

可以通过C ++ 17语言functionreplace:

  • String_ref →std :: string_view
  • 文件系统 → <文件系统> (Filesystem TS)
  • 可选 →std ::可选( Library Fundamentals TS v1 )
  • 任何 →std :: any(库基础TS v1)
  • math/特殊函数 → <cmath> ( 特殊mathIS ),请参阅下面的列表
    • beta函数
    • (正常/相关/球形)勒让德多项式
    • (正常/关联)勒让德多项式
    • Hermite多项式
    • 贝塞尔(J / Y / I / K)函数(Y在C ++中称为Neumann函数)
    • 球面贝塞尔(j / y)函数
    • (第一/第二/第三类)的(不完整/完整)椭圆积分,
    • 黎曼ζfunction
    • 指数积分Ei
  • 变体 →std :: variant( P0088R2 )

标准团队仍在努力:

  • math通用因子 →std :: experimetal :: gcd,lcm(图书馆基础知识TS v2)
  • 概念检查 →概念TS
  • 范围 →范围TS
  • Asio →networkingTS(仅适用于套接字和定时器)
  • 多精度 →数字TS
  • 协程 / 协程2 →协程TS

MPL的很大一部分可以使用可变模板来修剪或删除。 一些常用的词法转换可以用std :: to_string和std :: sto X代替。

一些Boost库与C ++ 11相关,但也有一些扩展,例如Boost.Functional / Hash包含hash_combine和在C ++ 11中找不到的相关函数, Boost.Chrono有I / O和四舍五入等许多时钟,等等,所以你可能还是想在推掉它们之前先看看它们。

其实,我不认为助推器会成为遗产。

是的,你应该能够使用std::type_traitsregexshared_ptrunique_ptrtuple<>std::tiestd::begin代替Boost Typetraits / Utility,Boost Smartpointer,Boost Tuple,Boost Range libraries实际上应该不需要“切换”,除非你将更多的代码移动到c ++ 11。

另外,根据我的经验,这些大多数的std版本都不太有用。 如AFAICT标准没有

  • Perl5正则expression式
  • call_traits
  • 某些正则expression式接口成员(比如bool boost::basic_regex<>::empty() )和其他接口差异
    • 由于Boost接口与Boost Xpressive完全匹配,因此这一点更多
    • 而且它和Boost Stringalgorithm的搭配很好,显然,后者没有标准的对应(还有?)
  • 许多与TMP(Boost Fusion)有关的东西
  • 懒惰,基于expression模板的lambdaexpression式; 他们有不可避免的好处,因为他们今天 可以是多态的,而不是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 lambdaexpression式(带有尾随返回types,显式捕获和声明参数)仍然有一些吸引力。

另外,Boost有很大的作用,恰恰是促进从C ++ 03到C ++ 11的path迁移,并集成C ++ 11和C ++ 03代码库。 我特别想到

  • Boost Auto(BOOST_AUTO)
  • 升压实用程序( boost::result_of<>和相关)
  • 提升Foreach(BOOST_FOREACH)
  • 不要忘记:Boost Move – 使用移动语义编写类,语法可以在C ++ 03编译器上使用Boost 1_48 +和C ++ 11编译器编译。

只是我的$ 0.02