哪个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)
-
log1p
,expm1
-
cbrt
,cbrt
-
acosh
,asinh
,atanh
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_traits
, regex
, shared_ptr
, unique_ptr
, tuple<>
, std::tie
, std::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