型特性関数の概要(C++11)
型特性関数(C++11):インデックス への移動
C++Builder 2009 では、コンパイル時のメタプログラミング技術をサポートする目的で設計された型特性関数のライブラリをサポートします。
これらの型特性関数は、typeid、sizeof および decltype と同様の方式で定義された固有の型関数です。 型特性関数はコンパイル時に型を受け付け、結果として、通常は bool 型としてコンパイル時の定数式を返します。
各型特性関数は型特性それぞれに基づいて名づけられ、2 重のアンダースコア(__)が先頭に付きます。これは実装のために確保された名前であることを示します。
たとえば、次は型特性関数は T が共用体型の場合は True と評価され、それ以外は False です。
bool __is_union(typename T)
typename キーワードは説明目的のみでここで使用し、引数として値ではなく型をとる関数を示しています。
型特性関数と他の組み込み関数の差分
型特性関数は、任意の式(typeid、sizeof および decltype で指定可能)ではなく、名前付きの型のみを受け付けます。 複数の引数を型特性関数に指定できますが、コンマで区切ったリストは typeid、sizeof および decltype でのコンマ演算子の使用と同様に解釈されます。
同様に、ビット フィールドの型の参照を試みると(decltype の使用など)、ビット フィールドのベースの格納型が生成され、その内容は型特性関数でテストされたものです。
不完全型と型特性関数
型特性関数の多くは不完全型を扱います。 たとえば、クラスが前方宣言された後では、型が共用体や列挙体あるいは基本型ではなくクラスであると特定することができます。 クラスには、参照やポインタなどが含まれていることがあります。 そのため、大半の型特性関数では、void および境界が不明な(完全型の)配列という 2 種類の特別な不完全型も扱えます。 これらの 2 種類の不完全型の場合、大半の型特性関数は false を返します。
ただし、いくつかの型関数の場合は完全型が必要です。 たとえば、基底クラスや自明性について知るにはクラス宣言では不十分です。
便宜上、C++Builder には以下の型特性関数が実装されています。
__is_complete_type(T)
この型特性関数は、トレンスレーション ユニットのどこに存在するかで異なる結果をコンパイル時に返す可能性があるという点で他とは異なります。 この現象により、この型特性関数を不用意に使用すると、ODR 違反が発生しかねません。
型が完全型、境界の不明な配列、(場合によって const や volatile で修飾されている) void のいずれかでなければならない型特性関数の一覧については、『作業ドラフト:プログラミング言語 C++ 標準規格』の第 20 節の 表 43: "Type Property Predicates"(型特性述語)を参照してください。