几年前我把我的C ++技能放在架子上,现在看来,当我再次需要它们时,景观已经发生了变化。
我们现在有了C ++ 11,我的理解是它与许多Boost功能重叠。
是否有一些摘要表明这些重叠是什么,哪些Boost库将成为遗产,推荐哪些C ++ 11功能使用而不是使用哪些?哪个更好?
答案 0 :(得分:278)
可由C ++ 11语言功能或库替换
<cmath>
,请参阅下面的列表
log1p
,expm1
cbrt
,hypot
acosh
,asinh
,atanh
TR1(如果它们是TR1库,它们会在documentation中标记)
从C ++ 11反向移植的功能:
可由C ++ 17语言功能替代:
<cmath>
(Special Math IS),请参阅下面的列表
标准团队仍在努力:
可以使用可变参数模板修剪或删除大部分MPL。 Lexical cast的一些常见用例可以替换为std :: to_string和std :: sto X 。
一些Boost库与C ++ 11相关,但也有一些扩展,例如Boost.Functional/Hash包含hash_combine以及在C ++ 11中找不到的相关函数,Boost.Chrono具有I / O和舍入以及许多其他时钟等,因此您可能仍需要查看在真正解雇他们之前,他们已经加强了。
答案 1 :(得分:54)
实际上,我认为升级库不会成为遗产。
是的,您应该能够使用std::type_traits
,regex
,shared_ptr
,unique_ptr
,tuple<>
,std::tie
,{{1而不是Boost Typetraits / Utility,Boost Smartpointer,Boost Tuple,Boost Range库,但实际上应该不需要'切换',除非你将更多的代码移动到c ++ 11。
另外,根据我的经验,大多数std::begin
版本的功能都不太明显。例如。 AFAICT标准不有
std
)和其他接口差异
懒惰,基于表达模板的lambdas;它们具有不可避免的好处,因为它们可以是今天,而不是C ++ 11。因此,它们通常可以更简洁:
bool boost::basic_regex<>::empty()
最明确的是,这仍然比C ++ 11 lambdas有一些吸引力(具有尾随返回类型,显式捕获和声明的参数)。
此外,Boost还有一个很大的作用,正是在促进从C ++ 03到C ++ 11的路径迁移以及集成C ++ 11和C ++ 03代码库的过程中。我特别想到
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);
及相关的)只需我0.02美元