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的內容
TR1包含以下組件:
一般用途
- 引用包裝器(Reference Wrapper)
- 來自Boost.Ref [1]
- 在
<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[2]
- 由
<memory>
頭文件增加了 -shared_ptr
、weak_ptr
等 - 將Resource Acquisition Is Initialization(RAII)手法用於內存管理和異常安全性。
仿函數
以下四個模組被加進<functional>
標頭檔之中:
- 多形態的函式包裝器(Polymorphic Function Wrapper)
function
- 基於Boost.Function[3]
- 儲存任何使用特定函式簽名的"可呼叫物"(函數指針、成員函式指針、仿函數),不需要可呼叫物確切的型別。
- 仿函數綁定器(Function Object Binders)
bind
- 採納自Boost Bind library[4]
- 標準
std::bind1st
和std::bind2nd
的通用版 - 將參數綁定給仿函數,並且允許函式的結合。
- 函式返回型別
result_of
- 採納自Boost
- 決定函式呼叫的返回型別
- 成員函式
mem_fn
- 採納自Boost Mem Fn library[5]
- 標準
std::mem_fun
和std::mem_fun_ref
的加強版 - 允許成員函式指針能夠像仿函數一樣
元編程和型別特性(Type Traits)
- 新的
<type_traits>
頭文件 -is_pod
、has_virtual_destructor
、remove_extent
等 - 採納自Boost Type Traits library[6]
- 允許類編查詢以及類別間的轉換,可促進元編程
數值工具
隨機數產生器
- 新的
<random>
頭文件 -variate_generator
、mersenne_twister
、poisson_distribution
等 - 採納自Boost Random Number Library[7]
數學函式
- 新的
<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)
定量陣列(Fixed Size Array)
- 新
<array>
標頭檔 -array
- 來自Boost Array library[9]
- 與動態陣列型別,像是標準的
std::vector
相反,是靜態的矩陣,但是能夠享受類似於begin()等與std::vector
相似的接口。
哈希表(Hash Tables)
- 新
<unordered_set>
、<unordered_map>
標頭檔 - 完全是新的實作,不衍生自既有之程式庫。與既有之程式庫API並不完全相容
- 就如同所有的哈希表提供常數時間的元素查找,但最壞情況查找時間與容器的大小呈線性關係。
正規表示式
- 新
<regex>
標頭檔 -regex
、regex_match
、regex_search
、regex_replace
等 - 來自Boost RegEx library[10]
- 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++標準程式庫的一部分
參考文獻
腳註
- ^ ref - 1.72.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-04-03).
- ^ Boost.SmartPtr: The Smart Pointer Library - 1.72.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-04-03).
- ^ Chapter 16. Boost.Function - 1.72.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-04-03).
- ^ Chapter 1. Boost.Bind - 1.72.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-04-03).
- ^ Chapter 1. Boost.Member Function - 1.72.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-04-03).
- ^ Chapter 1. Boost.TypeTraits - 1.37.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-07-15).
- ^ [1](頁面存檔備份,存於網際網路檔案館)
- ^ The Boost Tuple Library – Boost 1.48.0. [2006-05-27]. (原始內容存檔於2006-05-26).
- ^ Chapter 5. Boost.Array - 1.72.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-07-01).
- ^ Boost.Regex - 1.36.0. www.boost.org. [2022-07-01]. (原始內容存檔於2022-07-11).
其他
- 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程式庫的背景以及理由。