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)尤其有用，當模板参数推導不出引用的時候（範例如下：）
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 ) ;   连带勒让德多项式 double assoc_legendre( unsigned l, unsigned m, double x ) ;   Beta 函数 double beta( double x, double y ) ;   第一类完全椭圆积分 double comp_ellint_1( double k ) ;   第二类完全椭圆积分 double comp_ellint_2( double k ) ;   第三类完全椭圆积分 double comp_ellint_3( double k , double nu ) ;   合流超几何函数 double conf_hyperg( double a, double c, double x ) ;   第一类变形贝塞尔函数 double cyl_bessel_i( double nu, double x ) ;   第二类变形贝塞尔函数 double cyl_bessel_j( double nu, double x ) ;   第三类变形贝塞尔函数 double cyl_bessel_k( double nu, double x ) ;   柱诺依曼函数
第二类柱贝塞尔函数 double cyl_neumann( double nu, double x ) ;   第一类不完全椭圆积分 double ellint_1( double k, double phi ) ;   第二类不完全椭圆积分 double ellint_2( double k, double phi ) ;   第三类不完全椭圆积分 double ellint_3( double k, double nu, double phi ) ;   指数积分 double expint( double x ) ;   埃爾米特多項式 double hermite( unsigned n, double x ) ;   超几何级数 double hyperg( double a, double b, double c, double x ) ;   拉盖尔多项式 double laguerre( unsigned n, double x ) ;   勒让德多项式 double legendre( unsigned l, double x ) ;   黎曼zeta函数 double riemann_zeta( double x ) ;   第一类球贝塞尔函数 double sph_bessel( unsigned n, double x ) ;   球谐函数 double sph_legendre( unsigned l, unsigned m, double theta ) ;   球诺依曼函数
第二类球贝塞尔函数 double sph_neumann( unsigned n, double x ) ;  

 容器 
 多元組型別（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++標準程式庫的一部分

 参考文献 
 腳註 

 其他 



 外部連結 
Scott Meyers' Effective C++: TR1 Information - 包含TR1提案文件的連結，提供了TR1程式庫的背景以及理由。

Category:C++