《Boost程序库探秘——深度解析C++准标准库》之试读
前一阵子还看到一篇文章,说C#要重蹈C++的覆辙,这里说的C++的覆辙是什么呢?是指C++语言过于臃肿的功能特性,导致学习人员的流失。文章说,语言最后的威力是“开发软件”,而不是“比拼新特性”
在大学中,C++算是比较难学的语言。有些学校试图直接让学生们学习C++,结果效果不怎么好。这次,C++11又添加了大量新特性,如lambda,auto等,把C++弄的像动态语言一样。
添加了那么多新特性,而为了照顾用户的习惯和已有的代码。又不能去除一些旧的特性,这样导致了C++越来越臃肿和复杂。记得在哪里看过,好像是塞伯斯塔的程序设计语言一书中说的吧:程序语言发展的一个重要的特性就是易学性。而语言的简洁程度在很大程度上影响了语言的易学性。况且在不抛弃老的特性的情况下,又添加了新的特性。会大大增加语言的学习成本。
令人奇怪的是,C++Primer英文版第五版有1225页,而包含C++11的第六版C++Primer一书仍然只有1200页。并没有增加,反而减少了25页(第六版的C++Primer我没有读,不能评价其内容)。在未来,简洁且同样高效的类C语言——Go语言或许会对臃肿的C++发起挑战。
当然,这只是我的看法,现在还说不清这种大杂烩会对C++的未来产生什么影响。
阅读C++的代码,一直是一件痛苦的事,尤其是STL相关的。C++11的一些新特性,让C++代码的可读性大大增强。如自动类型推导auto,这在基本类型的使用时还没发现其优点,但是在使用模板时,auto就可以大大简化代码。引用一个例子:vector<int>::const_iteratorci = vi.begin();,在引入auto后,就可以简化成auto ci = vi.begin();
此外,还有一些其他的特性值得关注,这里就先不一一细数了。
这本书是关于Boost库的,C++11的出现,势必会对Boost现有的一些库产生影响。为了方便大家,下面就列出一些C++11对Boost库的影响列表(这个列表是网上收集整理翻译来的,可能不准确或不全,请大家见谅):
原Boost库 | C++11新的特性或库 |
BOOST_FOREACH | 基于Range的for循环替代。(序列for循环,有点像Python的for循环了) |
Functional/Forward | 新的标准库std::forward |
BOOST_Lambda | Lambda表达式 |
Min-Max | 新的标准库std::min|max、std::minmax_element |
Move | 右值引用 |
Ratio | 新的标准库std::ratio |
StaticAssert | static_assert |
Thread | <thread> |
Typeof | auto, decltype,推断变量或表达式的数据类型 |
Valueinitialized | List-initialization |
Array | 新的标准库std::array |
Bind | 新的标准库std::bind |
EnableIf | 新的标准库std::enable_if |
Function | 新的标准库std::function |
MemberFunction | 新的标准库std::mem_fn |
Random | <random> |
Ref | 新的标准库std::ref、std::cref |
Regex | C++11的regex |
ResultOf | 新的标准库std::result_of |
SmartPtr | 新的标准库std::unique_ptr、std::shared_ptr、std::weak_ptr |
Swap(swapping arrays) | 新的标准库std::swap |
Tuple | 新的标准库std::tuple |
TypeTraits | <type_traits> |
Unordered | <unordered_set>、<unordered_map> |
Boost库是非常强大的,但对初学者(这里的初学者并不是真正意义上的C++语言初学者,而是已经了解C++基本语法的初学者)来说,当务之急是了解C++11的标准库内容。能用标准库的,尽量用标准库。在熟练以后,使用这本书去查找自己需要的库。不要一头扎进Boost的海洋,那样会让人迷茫而打退堂鼓。
通过阅读本书的样章,会发现这是一本参考书。看到这里,读者或许会说,这不是废话吗,我也知道这是参考书。但我真遇到一些人,将这一类书拿来当教科书使用。或许真有这样的人适合这种学习方法的。不过我建议大家还是把这本书作为电脑旁的参考书使用。您会发现,这本书将在你需要的时候节省您宝贵的时间。
本书实际上是作者写的第二版介绍Boost库的书。所以在样章中介绍的Boost库内容,已经考虑到了C++11的新特性,如在第四章介绍hash时,书中提到了C++TR1草案。昨天的TR1草案,大部分已经变成现在的C++11的特性。所以使用本书,不必担心本书是否“过时”的问题。
罗马不是一天建成的,Boost库也不是一两个月可以了解清楚的。相信在这本书的帮助下,再加上平时的实践,您对Boost库会有一个更深刻的了解。