C++ Technical Report 1

C++ Technical Report 1（TR1）是ISO/IEC TR 19768, C++ Library Extensions（函式库扩充）的一般名称。TR1是一份文件，内容提出了对C++标准函式库的追加项目。这些追加项目包括了正则表达式、智能指针、哈希表、随机数生成器等。TR1自己并非标准，它是一份草稿文件。然而它所提出的项目大多数已成为的C++11及之后版本的官方标准的一部分。这份文件的目标在于“为扩充的C++标准函式库建立更为广泛的现成实作品”。

## 概要

编译器并不需要保证包含TR1的组件，因为TR1并非官方标准的一部分。顺带一提，Boost提供了TR1大部分的实作，数个编译器／函式库开发商也已提供了各自的实作版本。

TR1并不代表下一届标准的全部；举例而言，下一届的标准C++11包含了线程的支援。

新的组件被放置在`std::tr1`的命名空间（namespace）里，以和现在的标准函式库做区别。

## TR1的内容

TR1包含以下组件：

### 一般用途

引用包装器（Reference Wrapper）

- 来自Boost.Ref
- 在`<functional>` 头文件中增加了 - `cref`、`ref`、`reference_wrapper`
- 可以对算法（algorithms）或仿函数（function objects）传递引用（references），而不是传递副本。

一个wrapper reference是由模板类`reference_wrapper`产生的实体（instance）获得。wrapper reference近似于C++语言中的引用。

使用`ref`以获得任何实例的wrapper reference（对常数引用const &使用`cref`）。

wrapper reference对模板函数(template function)尤其有用，当模板参数推导不出引用的时候（范例如下：）

```cpp
void f( int &r ) { r++; }

template< class Funct, class Arg >
void g( Funct f, Arg t )
{
  f(t);
}

int main()
{
  int i = 0;
  g( f, i );          // 'g< void(int &r), int >' 被实例化
  cout << i << endl;  // 輸出：0

  g( f, ref(i) );     // 'g< void(int &r), reference_wrapper<int> >' 被实例化
  cout << i << endl;  // 輸出：1
}
```

智能指针（Smart Pointers）

- 基于Boost Smart Pointer library
- 由`<memory>`头文件增加了 - `shared_ptr`、`weak_ptr`等
- 将Resource Acquisition Is Initialization(RAII)手法用于内存管理和异常安全性。

### 仿函数

以下四个模组被加进`<functional>`标头档之中：

多形态的函式包装器（Polymorphic Function Wrapper）

- `function`
- 基于Boost.Function
- 储存任何使用特定函式签名的"可呼叫物"（函数指针、成员函式指针、仿函数），不需要可呼叫物确切的型别。

仿函数绑定器（Function Object Binders）

- `bind`
- 采纳自Boost Bind library
- 标准`std::bind1st`和`std::bind2nd`的通用版
- 将参数绑定给仿函数，并且允许函式的结合。

函式返回型别

- `result_of`
- 采纳自Boost
- 决定函式呼叫的返回型别

成员函式

- `mem_fn`
- 采纳自Boost Mem Fn library
- 标准`std::mem_fun`和`std::mem_fun_ref`的加强版
- 允许成员函式指针能够像仿函数一样

### 元编程和型别特性（Type Traits）

- 新的`<type_traits>`头文件 - `is_pod`、`has_virtual_destructor`、`remove_extent`等
- 采纳自Boost Type Traits library
- 允许类编查询以及类别间的转换，可促进元编程

### 数值工具

#### 随机数产生器

- 新的`<random>`头文件 - `variate_generator`、`mersenne_twister`、`poisson_distribution`等
- 采纳自Boost Random Number Library

#### 数学函式

- 新的`<cmath>`/`<math.h>`头文件 - `beta`、`legendre`等
- 23种数学函式

函数名｜函数原型｜数学表达式

连带拉盖尔多项式｜double assoc_laguerre( unsigned n, unsigned m, double x ) ;｜${L_n}^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n+m}(x), \text{ for } x \ge 0$

连带勒让德多项式｜double assoc_legendre( unsigned l, unsigned m, double x ) ;｜${P_l}^m(x) = (1-x^2)^{m/2} \frac{d^m}{dx^m} P_l(x), \text{ for } x \ge 0$

Beta 函数｜double beta( double x, double y ) ;｜$\Beta(x,y)=\frac{\Gamma(x) \Gamma(y)}{\Gamma(x+y)}$

第一类完全椭圆积分｜double comp_ellint_1( double k ) ;｜$K(k) = F\left(k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \frac{d\theta}{\sqrt{1 - k^2 \sin^2 \theta}}$

第二类完全椭圆积分｜double comp_ellint_2( double k ) ;｜$E\left(k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \sqrt{1 - k^2 \sin^2 \theta}\; d\theta$

第三类完全椭圆积分｜double comp_ellint_3( double k , double nu ) ;｜$\Pi\left(\nu, k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \frac{d\theta}{(1 - \nu \sin^2 \theta)\sqrt{1 - k^2 \sin^2 \theta}}$

合流超几何函数｜double conf_hyperg( double a, double c, double x ) ;｜$F(a, c, x) = \frac{\Gamma(c)}{\Gamma(a)} \sum_{n = 0}^\infty \frac{\Gamma(a + n) x^n}{\Gamma(c + n) n!}$

第一类变形贝塞尔函数｜double cyl_bessel_i( double nu, double x ) ;｜$I_\nu(x) = i^{-\nu} J_\nu(ix) = \sum_{k = 0}^\infty \frac{(x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ for } x \ge 0$

第二类变形贝塞尔函数｜double cyl_bessel_j( double nu, double x ) ;｜$J_\nu(x) = \sum_{k = 0}^\infty \frac{(-1)^k \; (x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ for } x \ge 0$

第三类变形贝塞尔函数｜double cyl_bessel_k( double nu, double x ) ;｜$\begin{align} K_\nu(x) & = \textstyle\frac{\pi}{2} i^{\nu+1} \big(J_\nu(ix) + i N_\nu(ix)\big) \\ & = \begin{cases} \displaystyle \frac{I_{-\nu}(x) - I_\nu(x)}{\sin \nu\pi}, & \text{for } x \ge 0 \text{ and } \nu \notin \mathbb{Z} \\[10pt] \displaystyle \frac{\pi}{2} \lim_{\mu \to \nu} \frac{I_{-\mu}(x) - I_\mu(x)}{\sin \mu\pi}, & \text{for } x < 0 \text{ and } \nu \in \mathbb{Z} \\ \end{cases} \end{align}$

柱诺依曼函数 第二类柱贝塞尔函数｜double cyl_neumann( double nu, double x ) ;｜$N_\nu(x) = \begin{cases} \displaystyle \frac{J_\nu(x)\cos \nu\pi - J_{-\nu}(x)}{\sin \nu\pi}, & \text{for } x \ge 0 \text{ and } \nu \notin \mathbb{Z} \\[10pt] \displaystyle \lim_{\mu \to \nu} \frac{J_\mu(x)\cos \mu\pi - J_{-\mu}(x)}{\sin \mu\pi}, & \text{for } x < 0 \text{ and } \nu \in \mathbb{Z} \\ \end{cases}$

第一类不完全椭圆积分｜double ellint_1( double k, double phi ) ;｜$F(k,\phi)=\int_0^\phi\frac{d\theta}{\sqrt{1-k^2\sin^2\theta}}, \text{ for } \left|k\right| \le 1$

第二类不完全椭圆积分｜double ellint_2( double k, double phi ) ;｜$\displaystyle E(k,\phi)=\int_0^\phi\sqrt{1-k^2\sin^2\theta}d\theta, \text{ for } \left|k\right| \le 1$

第三类不完全椭圆积分｜double ellint_3( double k, double nu, double phi ) ;｜$\Pi(k,\nu,\phi)=\int_0^\phi\frac{d\theta}{\left(1-\nu\sin^2\theta\right)\sqrt{1-k^2\sin^2\theta}}, \text{ for } \left|k\right| \le 1$

指数积分｜double expint( double x ) ;｜$\mbox{E}i(x)=-\int_{-x}^{\infty} \frac{e^{-t}}{t}\, dt$

埃尔米特多项式｜double hermite( unsigned n, double x ) ;｜$H_n(x)=(-1)^n e^{x^2}\frac{d^n}{dx^n}e^{-x^2}\,\!$

超几何级数｜double hyperg( double a, double b, double c, double x ) ;｜$F(a,b,c,x)=\frac{\Gamma(c)}{\Gamma(a)\Gamma(b)}\sum_{n = 0}^\infty\frac{\Gamma(a+n)\Gamma(b+n)}{\Gamma(c+n)}\frac{x^n}{n!}$

拉盖尔多项式｜double laguerre( unsigned n, double x ) ;｜$L_n(x)=\frac{e^x}{n!}\frac{d^n}{dx^n}\left(x^n e^{-x}\right), \text{ for } x \ge 0$

勒让德多项式｜double legendre( unsigned l, double x ) ;｜$P_l(x) = {1 \over 2^l l!} {d^l \over dx^l } (x^2 -1)^l, \text{ for } \left|x\right| \le 1$

黎曼zeta函数｜double riemann_zeta( double x ) ;｜$\Zeta(x) = \begin{cases} \displaystyle \sum_{k = 1}^\infty k^{-x}, & \text{for } x > 1 \\[10pt] \displaystyle 2^x\pi^{x-1}\sin\left(\frac{x\pi}{2}\right)\Gamma(1-x)\zeta(1-x), & \text{for } x < 1 \\ \end{cases}$

第一类球贝塞尔函数｜double sph_bessel( unsigned n, double x ) ;｜$j_n(x) = \sqrt{\frac{\pi}{2x}} J_{n+1/2}(x), \text{ for } x \ge 0$

球谐函数｜double sph_legendre( unsigned l, unsigned m, double theta ) ;｜$Y_{l}^{m}(\theta, 0) \text{ where } Y_{l}^{m}(\theta, \phi) = (-1)^{m}\left[\frac{(2l+1)}{4\pi}\frac{(l-m)!}{(l+m)!}\right]^{1 \over 2} P_{l}^{m}(\cos \theta)e^{\mathrm{i}m\phi}, \text{ for } |m| \leq l$

球诺依曼函数 第二类球贝塞尔函数｜double sph_neumann( unsigned n, double x ) ;｜$n_n(x) = \left(\frac{\pi}{2x}\right)^{\frac{1}{2}}N_{n+\frac{1}{2}}(x), \text{ for } x \ge 0$

### 容器

#### 多元组型别（Tuple Types）

- 新`<tuple>`标头档 - `tuple`
- 采纳自Boost Tuple library
- 标准`std::pair`的扩充
- 固定尺寸的元素集合，元素可以是不同的类型

#### 定量阵列（Fixed Size Array）

- 新`<array>`标头档 - `array`
- 来自Boost Array library
- 与动态阵列型别，像是标准的`std::vector`相反，是静态的矩阵，但是能够享受类似于begin等与`std::vector`相似的接口。

#### 哈希表（Hash Tables）

- 新`<unordered_set>`、`<unordered_map>`标头档
- 完全是新的实作，不衍生自既有之程式库。与既有之程式库API并不完全相容
- 就如同所有的哈希表提供常数时间的元素查找，但最坏情况查找时间与容器的大小呈线性关系。

### 正规表示式

- 新`<regex>`标头档 - `regex`、`regex_match`、 `regex_search`、`regex_replace`等
- 来自Boost RegEx library
- pattern matching library

### C的兼容性

C++被设计成与C语言兼容，但由于不同的标准，C++并不是C的严格超集合。TR1试图调和这些差异，透过对各种标头档，如、等进行扩充。

这些改变帮助C++能够与C99版本的C标准更为一致（并非所有C99都包含于TR1）。

## 关联项目

- C++11，C++新标准
- C99，C语言标准
- Boost library，提供大量的C++程式库，数个包含于TR1
- STL标准模板库，现行C++标准程式库的一部分

## 外部链接

- Scott Meyers' Effective C++: TR1 Information - 包含TR1提案文件的连结，提供了TR1程式库的背景以及理由。