C++ Technical Report 1(TR1、ISO/IEC TR 19768:2007)は、標準
C++ライブラリを拡張するための技術仕様であり、非公式な名称として広く知られています。TR1は、
正規表現、スマートポインタ、
ハッシュテーブル、
擬似乱数生成器といった、現代的なプログラミングに不可欠な多くの機能を提供しています。TR1の主な目的は、拡張された標準
C++ライブラリの利用方法に関する標準的な慣習を確立することでした。
TR1の概要
TR1は、その仕様の一部または全部を既に実装しているコンパイラやライブラリも存在します。特に注目すべきは、TR1の機能の多くがBoostライブラリに含まれている点です。これにより、Boostライブラリを利用することで、TR1の恩恵を比較的容易に享受できます。ただし、TR1は
C++ライブラリの拡張の全てではありません。
C++11では、スレッドに関するライブラリや、move semantics、variadic templatesといった言語機能自体の拡張も行われ、STL全体が大幅に強化されました。
TR1で追加されたライブラリは、現行の標準ライブラリと区別するために、`std::tr1`
名前空間に配置されていましたが、
C++11では`std`
名前空間に統合されました。TR1は
C++11に必須ではありませんが、現在の
C++環境で完全に実装できるわけではありません。例えば、型のPOD性を検査する`is_pod`関数は、現行の
C++ではクラスがPODであるかを判別する方法がないため、コンパイラ独自の拡張機能を使用するか、擬似的な実装に留まっています。これは、かつて一部コンパイラがテンプレートの部分特殊化に対応していなかった時代のSTLの擬似実装と類似した状況です。
重要な注意点として、TR1は
C++の仕様の一部ではないため、`std::tr1`
名前空間やTR1の機能に依存したコードは、将来的に問題を引き起こす可能性があります。これは、最近のドラフトであるn3225で、`
`で定義される`has_`が`is_`に変更されたことや、`std::tr1`が次期標準に含まれないことが理由です。
実装
TR1の主な実装には以下のものが挙げられます。
Visual C++ 2008のFeature Packおよびそれ以降のサービスパック
libstdc++
Boost
TR1の内容
TR1には、以下のような幅広い機能が含まれています。
一般ユーティリティ
参照ラッパ: Boost.Refに由来し、``ヘッダに追加されました。`cref`、`ref`、`reference_wrapper`を提供し、アルゴリズムや関数オブジェクトに対して、値渡しではなく参照渡しを可能にします。
スマートポインタ: Boost Smart Pointer libraryを基にしています。``ヘッダに追加され、`shared_ptr`、`weak_ptr`などが含まれます。参照カウントに基づくスマートポインタであり、メモリ管理をより安全に行うためのユーティリティです。
``ヘッダに以下の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`を機能向上させたものです。
``ヘッダ: 新しく追加されたヘッダで、`is_pod`、`has_virtual_destructor`(C++11では`is_virtual_destructible`に変更)、`remove_extent`などが含まれます。Boost Type Traits libraryを基にしており、データ型に関する問い合わせを容易にし、メタプログラミングを支援します。
数値計算
擬似乱数生成: 新しく``ヘッダが追加され、`variate_generator`、`mersenne_twister`、`poisson_distribution`などが提供されます。Boost Random Number Libraryを基にしています。
数学関数: ``/``ヘッダに、`beta`、`legendre`などの各種数学関数が追加されました。
コンテナ
タプル: 新しく``ヘッダが追加され、`tuple`が提供されます。Boost Tuple libraryを基にしており、`std::pair`の拡張として、さまざまなデータ型を混在できる容量固定のデータ構造を提供します。
容量固定配列: 新しく``ヘッダが追加され、`array`が提供されます。Boost Array libraryから採用され、標準の`std::vector`のような動的配列とは対照的な、容量固定の配列です。
ハッシュテーブル: 新しく``と``ヘッダが追加されました。既存のライブラリを基にしたものではなく、新たに作られたものです。要素の参照は大抵の場合定数時間で完了しますが、最悪の場合には線形時間がかかります。名前が`hash_set`(SGI版STLに含まれるライブラリ)などではないのは、標準の`set`と`map`がイテレータで順序付けされた要素アクセスを可能にするのに対し、`unordered_set`と`unordered_map`ではそれができないことを示すためです。実装ではなくインターフェース(利用法)に由来した名前付けの発想が用いられています。
``ヘッダ: 新しく追加されたヘッダで、`regex`、`regex_match`、`regex_search`、`regex_replace`などが提供されます。Boost Regex libraryを基にしており、正規表現によるパターンマッチングを行うためのライブラリです。
C互換ライブラリ
C++はC言語との互換性を保つように設計されていますが、現在では厳密な上位互換ではありません。TR1は、``、``、``などのヘッダを拡張することで、C言語との溝を埋めようと試みました。これにより、C99にある程度近づきましたが、C99の全てがTR1に含まれているわけではありません。
C++ Technical Report 2
C++ Technical Report 2も作成されましたが、正式に出版されることはありませんでした。
脚注
[1] ISO/IEC TR 19768:2007
[2] n3225
[3] Boost.Ref
[4] Boost Smart Pointer library
[5] Boost.Function
[6] Boost Bind library
[7] Boost Mem Fn library
[8] Boost Type Traits library
[9] Boost Random Number Library
[10] Boost Tuple library
[11] Boost Array library
[12] Boost Regex library
関連項目
C++11: TR1の内容が取り込まれたC++標準。
C++14
Boost: TR1の一部のライブラリの基となっている。
Standard Template Library: 現標準C++ライブラリの一部。
参考文献
Peter Becker: "The C++ Standard Library Extensions: A Tutorial and Reference", 2006, ISBN 0321412990. 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