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程式庫的背景以及理由。