C++テクニカルレポート1(TR1 )は、ISO/IEC TR 19768「C++ライブラリ拡張」の通称であり、 C++03言語標準のC++標準ライブラリへの追加を提案した文書です。追加される機能には、正規表現、スマートポインタ、ハッシュテーブル、乱数生成器などがあります。TR1自体は標準ではなく、ドラフト文書でした。しかし、その提案のほとんどは、後に公式標準であるC++11の一部となりました。C++11が標準化される前は、ベンダーはこの文書をガイドとして拡張機能を作成していました。このレポートの目的は、「拡張されたC++標準ライブラリのための、より広範な既存の慣行を構築すること」でした。
この報告書は、2005年に「C++ライブラリ拡張に関する技術報告書草案」として草案の形で初めて配布され、その後2007年にISO/IEC規格としてISO/IEC TR 19768:2007として発行されました。
TR1 の提案は標準自体の一部ではなく、まだ承認されていない追加可能な機能のセットに過ぎなかったため、コンパイラはC++ 標準に準拠するために TR1 コンポーネントを含める必要はありませんでした。ただし、TR1 の大部分はBoostから入手可能であり、いくつかのコンパイラ/ライブラリ配布元はコンポーネントのすべてまたは一部を実装していました。TR1 は、 C++11に登場したライブラリへの追加機能の完全なリストではありません。たとえば、C++11 には TR1 には含まれていないスレッドサポートライブラリが含まれています。
新しいコンポーネントは、当時の標準ライブラリと区別するために、std::tr1名前空間内で定義された。
TR1には以下のコンポーネントが含まれています。
参照ラッパー–アルゴリズムや関数オブジェクトにコピーではなく参照を渡せるようにします。この機能は Boost.Ref に基づいています。 [ 1 ]ラッパー参照はテンプレートクラスのインスタンスから取得されます。ラッパー参照は、reference_wrapper C++ 言語の通常の参照 ('&') に似ています。任意のオブジェクトからラッパー参照を取得するには、テンプレートクラスをref使用します (定数参照の場合はcrefを使用します)。
ラッパー参照は、特にテンプレート関数において、引数推論では参照が推論されない場合(例えば、引数を転送する場合)に役立ちます。
#include <iostream> #include <tr1/functional>void f ( int & r ) { ++ r ; }template < class Func , class Arg > void g ( Func f , Arg t ) { f ( t ); }int main () { int i = 0 ;g ( f , i ); // 'g<void(int& r), int>' がインスタンス化されますstd :: cout << i << " \n " ; // 出力: 0g ( f , std :: tr1 :: ref ( i )); // 'g<void(int& r), std::tr1::reference_wrapper<int>>' がインスタンス化されますstd :: cout << i << " \n " ; // 出力: 1 }スマートポインター– 複雑なケースにおけるオブジェクトのライフサイクル管理を簡素化するクラスをいくつか追加します。追加される主なクラスは次の3つです。
shared_ptr– 参照カウント型スマートポインタweak_ptrshared_ptr参照カウントを増加させないバリアントこの提案はBoost Smart Pointerライブラリに基づいています。[ 2 ]
以下の4つのモジュールがヘッダーファイルに追加されます<functional>。
ポリモーフィック関数ラッパー(function) – 指定された関数呼び出しシグネチャを使用する任意の呼び出し可能な関数(関数ポインタ、メンバ関数ポインタ、および関数オブジェクト)を格納できます。型は、使用される呼び出し可能なオブジェクトの種類に依存しません。Boost.Function [ 3 ]に基づいています。
関数オブジェクトバインダー(bind) –任意のパラメータを関数オブジェクトにバインドできます。関数合成も可能です。これは標準のstd::bind1stbindstd::bind2nd関数の汎用バージョンです。この機能はBoost Bindライブラリに基づいています。[ 4 ]
関数の戻り値の型(result_of) – 呼び出し式の型を決定します。
メンバー関数(mem_fn) – 標準とへの拡張std::mem_fun。std::mem_fun_refメンバー関数へのポインタを関数オブジェクトとして扱うことができる。Boost Mem Fnライブラリに基づいています。[ 5 ]
現在、 、、など<type_traits>の多くの便利な特性メタテンプレートを含むヘッダーファイルがあります。これにより、 に対するクエリと異なる型間の変換が可能になり、メタプログラミングが容易になります。この提案は Boost Type Traits ライブラリに基づいています。[ 6 ]is_podhas_virtual_destructorremove_extent
<random>ヘッダーファイル – variate_generator、、などmersenne_twister。poisson_distributionTR1の一部の機能(数学特殊関数やC99で追加された特定の機能など)は、Visual C++版TR1には含まれていません。 数学特殊関数ライブラリはC++11では標準化されていません。
これらの機能は、工学および科学分野のプログラマーにとって特に関心の高いものとなるだろう。
以下の表は、TR1で説明されている23個の特殊関数すべてを示しています。
各関数にはさらに2つのバリエーションがあります。関数名に接尾辞「f」または「lfloat 」を付加すると、それぞれまたはの値に対して動作する関数になりますlong double。例:
float sph_neumannf ( unsigned int n , float x ); long double sph_neumannl ( unsigned int n , long double x );<tuple>ヘッダーファイル –tuplestd::pair<array>ヘッダーファイル –arraystd::vector<unordered_set>、ヘッダーファイル<unordered_map>unordered_set、それぞれunordered_multiset、、、、およびに類似した、、、、unordered_mapおよびunordered_multimapクラスを実装します。 setmultisetmapmultimapunordered_setは、、、、 および標準ライブラリ関数unordered_multisetと併用することはできません。これらの関数はおよび で機能します。set_unionset_intersectionset_differenceset_symmetric_differenceincludessetmultiset<regex>ヘッダーファイル– regex、、、などregex_match。regex_searchregex_replaceC++はC言語との互換性を保つように設計されていますが、標準規格が異なるため、Cの完全な上位互換言語ではありません。TR1は、C++ライブラリの<complex>、<locale>、<cmath>などの様々なヘッダーファイルへの追加を通じて、これらの相違点の一部を解消しようと試みています。これらの変更により、C++はC標準のC99バージョンにより近いものになります(TR1にはC99のすべての部分が含まれているわけではありません)。
2005 年、初心者プログラマー向けの Unicode、XML/HTML、ネットワーク、ユーザビリティに特に関心を持った TR2 の提案募集が行われました。TR2提案募集。
提案内容には以下のようなものがあった。
TR2の提案募集が開始された後、ISOの手順が変更されたため、TR2は発行されません。代わりに、C++の拡張機能は複数の技術仕様書で公開される予定です。上記に挙げた提案の中には、既にC++標準規格または技術仕様書の草案に含まれているものもあります。