Effective C++ 条款54 让自己熟悉包括TR1在内的标准程序库
1. TR1(Technical Report 1)是C++ 03标准的一个扩展,它并不属于C++ 03标准,只是一份草稿文件,用于指出下一版C++标准很可能吸收的特性.目前,它的大部分已被C++ 11采纳,成为官方标准.
2. C++ 98列出的标准库的组成:
STL(Standard Template Library,标准模板库).包含容器,迭代器,算法,函数对象,各种容器适配器(container adapter)和函数对象适配器(function object adapter)等.
Iostream.覆盖用户自定缓冲功能,国际化I/O,以及预先定义好的对象cout和cin.
国际化支持.比如多区域(multiple active locales)能力.像wchar_t(通常是16 bits/char)和wstring(有wchar_t组成的string)等类型都对促进Unicode有帮助.
数值处理.包括复数模板好纯数值数组.
异常阶层体系(exception hierarchy):包括base class exception及其derived class logic_error和runtime_error,以及更深继承的各个classes.
C89标准程序库.
3. TR1详细叙述了14个新组件(compnents),统统放在std命名空间的嵌套空间tr1内,包括:
智能指针.如tr1::shared_ptr,tr1::weak_ptr等,详见条款13.
tr1::function.此物可以表示任何callable entity(可调用物,也就是函数和函数对象),只要其签名复合目标,详见条款35.
tr1::bind.它能够做STL绑定器(binders)bind1st和bind2nd所做的每一件事且增加了更多特性:tr1::bind可以和const金额non-const成员函数共同运作,可以和by-reference参数协同运作,而且不需要特殊协助就可以处理函数指针.详见条款35
Hase tables.用来实现sets,multisets,maps,multimaps,每个容器接口都与之前标准相同,其命名为"tr1::unordered_set", "tr1::unordered_multiset", "tr1::unordered_map","tr1::unordered_multimap",说明它们和set,multiset,map,multimap的不同:以hash为基础的这些tr1容器内的元素并无可预期次序.
正则表达式(Regular expressions).包括包括以正则表达式为基础的字符串查找和替换,或是从某个匹配字符串到另一个匹配字符串的注意迭代等等.
Tuples(变量组).标准库pair template的新一代制品,pair只能持有两个对象,而tr1::tuple可持有任意个数对象.
tr1::array.本质上是个"STL化"数组,即一个支持成员函数如begin和end的数组.不过tr1::array的大小固定,并不适用动态内存.
tr1::mem_fn.其语句构造与成员函数指针一致,正如tr1::bind纳入并扩充了C++ 98的bind1st和bind2nd的能力,mem_fn纳入并扩充了C++98的mem_fun和mem_fun_ref的能力.
tr1::reference_wrapper."让reference的行为更像对象",造成容器"犹如持有reference".
随机数生成工具.大大超越了rand.
数学特殊函数,包括Laguerre多项式,Bessel函数,完全椭圆积分(complete elliptic integrals)以及其他函数.
C99 兼容扩充.一大堆函数和模板,用来将许多C99程序库特性带劲C++.
第二组TR1组件由更精巧的template编程技术(包括模板元编程,template metaprogramming,见条款48)构成:
Type traits.一组trait classes(见条款47),用以提供类型的编译期信息.如指出某个类型是否是个内置类型,是否提供virtual析构函数,是否是个empty class,是否可隐式转换为其他类型等等.TR1的type traits也可以显现该给定类型之适当齐位(proper alignment),这对定制性内存分配器(见条款50)的编写十分重要.
tr1::result_of.这是个template,用来推导函数调用的返回类型,tr1::result_of使得"指涉函数返回类型"变得十分容易.
4. TR1本身只是一份文档,并不涉及实现.然而TR1的14个组件中的10个已在免费的Boost程序库(见条款55)提供支持,虽然有些Boost机能并不完全吻合TR1规范.
所有的boost组件都位于命名空间boost内,可以使用
namespace std{ namespace std::tr1=::boost; }
通过指涉std::tr1::来指涉::boost