C++ Technical Report 1

C++ Technical Report 1 (TR1、Technical Report on C++ Library Extensions)は、ISO/IEC TR 19768:2007ISO/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の機能に依存したコードは後々問題を起こす可能性がある。というのも、最近のドラフトであるn3225では<type_traits>で定義される has_* はis_* へ変更されている。また、std::tr1 は次期標準の仕様にも含まれないので注意されたい。

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

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

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

 スマートポインタ 
 Boost Smart Pointer libraryを基にしている 。
 <memory>ヘッダに追加。 - shared_ptr, weak_ptr, etc
 より安全にメモリ管理を行うためのユーティリティ。参照カウントに基づくスマートポインタである。

 関数オブジェクト 
<functional>ヘッダに4つのモジュールが追加。
 function - 多態的関数ラッパ 
 Boost.Functionを基にしている。

 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>ヘッダが追加。 - is_pod, has_virtual_destructor(C++11ではis_virtual_destructibleに変更), remove_extent, etc
 Boost Type Traits libraryを基にしている。
 データ型に関しての問い合わせを容易にすることによってメタプログラミングの支援をする。

 数値計算 
 擬似乱数生成 
 新しく<random>ヘッダが追加。 - variate_generator, mersenne_twister, poisson_distribution, etc
 Boost Random Number Libraryを基にしている。

 数学関数 
 <cmath>/<math.h>ヘッダに追加。 - beta, legendre, etc
 各種数学関数。

 コンテナ  
 タプル 
 新しく<tuple>ヘッダが追加。 - tuple
 Boost Tuple libraryを基にしている。
 およそstd::pairの拡張である。
 さまざまなデータ型を混在できる容量固定のデータ構造である。

 容量固定配列 
 新しく<array>ヘッダが追加。 - array
 Boost Array libraryから採用された。
 標準の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を基にしている。
 正規表現によるパターンマッチングを行うライブラリ。

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

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

 脚注 

 関連項目 
 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

Category:C++