C++ Technical Report 1

**C++ Technical Report 1** (**TR1**、Technical Report on C++ Library Extensions)は、**ISO/IEC TR 19768:2007** の非公式名称で、標準C++ライブラリの拡張についての標準規格である。これには正規表現、スマートポインタ、ハッシュ表、擬似乱数生成器などが含まれている。TR1の目標は「拡張された標準C++ライブラリの使用方法について慣習を確立してほしい」とのことである。

## 概要
TR1は既に一部ないし全部を実装しているものもある。ちなみに、TR1のほとんどはBoostに含まれており、それが利用可能である。

TR1はC++のライブラリの拡張の全てではない。たとえばC++11ではスレッドに関するライブラリが含まれ、言語機能自体の拡張（move semanticsやvariadic templatesの追加など）などSTL全体に機能増強が行われた。

なお、TR1で追加されたライブラリは、現標準ライブラリと区別するため、名前空間 `std::tr1` に入れられている。しかし、C++11では名前空間 `std` に入れられた。

TR1にとってC++11は必須ではないが、現行のC++上で全て実装可能というわけでもない。例えば、型のPOD性を検査する関数`is_pod`の実装にあたって、現行のC++にはクラスがPODであることを判別する方法が無い。したがって、現在のC++処理系でのTR1実装は、コンパイラ独自の拡張機能を使用するか、あるいは擬似的な実現に留まる。この状況は、かつて一部コンパイラがテンプレートの部分特殊化に対応していなかった時代のSTLの擬似実装とよく似ている。

注意点としては、TR1はC++の仕様の一部ではないので、`std::tr1` 名前空間やTR1の機能に依存したコードは後々問題を起こす可能性がある。というのも、最近のドラフトであるn3225http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3225.pdfでは`<type_traits>`で定義される `has_*` は`is_*` へ変更されている。また、`std::tr1` は次期標準の仕様にも**含まれない**ので注意されたい。

## 実装
次のような実装が存在する。
*Visual C++ 2008のFeature Packそしてその後に出たサービスパック1
*libstdc++
*Boost

## 内容
TR1には次のものが含まれている。

### 一般ユーティリティ
#### 参照ラッパ
* Boost.Ref由来http://www.boost.org/doc/html/ref.html。
* `<functional>`ヘッダに追加。 - `cref`, `ref`, `reference_wrapper`
* アルゴリズムや関数オブジェクトに対して、値渡しではなく参照渡しを行うことができる。

#### [[ガベージコレクション|スマートポインタ]]
* Boost Smart Pointer libraryを基にしている http://www.boost.org/libs/smart_ptr/smart_ptr.htm。
* `<memory>`ヘッダに追加。 - `shared_ptr`, `weak_ptr`, etc
* より安全にメモリ管理を行うためのユーティリティ。参照カウントに基づくスマートポインタである。

### [[関数オブジェクト]]
`<functional>`ヘッダに4つのモジュールが追加。
#### function - [[ポリモーフィズム|多態的]]関数ラッパ
* Boost.Functionを基にしているhttp://www.boost.org/doc/html/function.html。

#### bind - 関数オブジェクトの束縛
* Boost Bind libraryから採用されたhttp://www.boost.org/libs/bind/bind.html。
* 現標準の`std::bind1st`及び`std::bind2nd`をより一般化したもので、関数オブジェクトへ引数の束縛を行う。

#### result_of - 関数の戻り値の型
* Boostを基にしている。
* 関数呼出式から、戻り値の型を決める機構。

#### mem_fn
* Boost Mem Fn libraryを基にしているhttp://www.boost.org/libs/bind/mem_fn.html。
* 現標準の`std::mem_fun`及び`std::mem_fun_ref`から機能向上したものである。
* メンバ関数へのポインタを関数オブジェクトにする機構である。

### [[メタプログラミング]]と型特性
* 新しく`<type_traits>`ヘッダが追加。 - `is_pod`, `has_virtual_destructor`(C++11では`is_virtual_destructible`に変更), `remove_extent`, etc
* Boost Type Traits libraryを基にしているhttp://www.boost.org/libs/type_traits/doc/html/index.html。
* データ型に関しての問い合わせを容易にすることによってメタプログラミングの支援をする。

### 数値計算
#### [[擬似乱数]]生成
* 新しく`<random>`ヘッダが追加。 - `variate_generator`, `[[メルセンヌ・ツイスタ|mersenne_twister]]`, `poisson_distribution`, etc
* Boost Random Number Libraryを基にしているhttp://www.boost.org/libs/random/。

#### 数学関数
* `<cmath>`/`<math.h>`ヘッダに追加。 - `[[ベータ関数 (数学)|beta]]`, `[[ルジャンドル多項式|legendre]]`, etc
* 各種数学関数。

### [[コンテナ (データ型)|コンテナ]]
#### [[タプル]]
* 新しく`<tuple>`ヘッダが追加。 - `tuple`
* Boost Tuple libraryを基にしているhttp://www.boost.org/libs/tuple/doc/tuple_users_guide.html。
* およそ`std::pair`の拡張である。
* さまざまなデータ型を混在できる容量固定のデータ構造である。

#### 容量固定[[配列]]
* 新しく`<array>`ヘッダが追加。 - `array`
* Boost Array libraryから採用されたhttp://www.boost.org/doc/html/array.html。
* 標準の`std::vector`のような動的配列とは全く逆の存在である。

#### [[ハッシュテーブル]]
* 新しく`<unordered_set>`, `<unordered_map>`ヘッダが追加。
* 既存のライブラリを基にしたものではなく、新たに作られたものである。
* 要素の参照は、大抵の場合定数時間で済むが、最悪の場合には線形時間かかる。
* 名前が`hash_set`（SGI版STLに含まれるライブラリ）などでないが、標準の`set`,`map`はイテレータを用いて順序付けされた（ソートされた）要素アクセスが可能であるのに対し、`unordered_set`, `unordered_map`では不可能であることを示している。実装ではなくインターフェース（利用法）に由来した名前をつける発想である。

### 正規表現
* 新たに`<regex>`ヘッダが追加。 - `regex`, `regex_match`, `regex_search`, `regex_replace`, etc
* Boost Regex libraryを基にしているhttp://www.boost.org/libs/regex/doc/html/index.html。
* 正規表現によるパターンマッチングを行うライブラリ。

### C互換ライブラリ
C++はC言語と互換になるように設計されているものの、現在C++は厳密な上位互換ではない。TR1はその溝を埋めるため, , その他のヘッダに拡張を行っている。これによってC99とある程度は近づいたものの、C99の全てがTR1に含まれているわけではない。 

## C++ Technical Report 2
C++ Technical Report 2 も作られたが、正式に出版されることはなかった。

## 脚注

## 関連項目
* C++11 - TR1の内容が取り込まれたC++標準。
* C++14
* Boost - TR1の一部のライブラリの基となっている。
* Standard Template Library - 現標準C++ライブラリの一部である。

## 参考文献
* Peter Becker: "The C++ Standard Library Extensions: A Tutorial and Reference", 2006, . TR1にも言及している。

## 外部リンク
* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf - このドラフト文書のPDF
* http://aristeia.com/EC3E/TR1_info_frames.html - スコット・メイヤーズ TR1 page, links to documents and articles