TR1

**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) 尤其有用，當模板參數推導不出參照的時候（範例如下：）

**智慧型指標（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 種數學函式

### 容器

#### 多元組型別（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 試圖調和這些差異，透過對各種標頭檔，如 <complex>、<locale>、<cmath> 等進行擴充。
這些改變幫助 C++ 能夠與 C99 版本的 C 標準更為一致（並非所有 C99 都包含於 TR1）。

## 關聯項目

* C++11，C++ 新標準
* C99，C 語言標準
* Boost library，提供大量的 C++ 程式庫，數個包含於 TR1
* STL 標準模板庫，現行 C++ 標準程式庫的一部分

## 參考文獻

### 腳註

### 其他

* ISO/IEC JTC1/SC22/WG21. Draft Technical Report on C++ Library Extensions (PDF). 2005-06-24 [2009-01-27]. （原始內容存檔 (PDF) 於 2011-04-14）.
* Becker, Peter. The C++ Standard Library Extensions: A Tutorial and Reference. Addison-Wesley Professional. 2006. ISBN 0-321-41299-0.

## 外部連結

* Scott Meyers' Effective C++: TR1 Information（頁面存檔備份，存於網際網路檔案館） - 包含 TR1 提案檔案的連結，提供了 TR1 程式庫的背景以及理由。