メタプログラミングライブラリ (C++11以降)
C++は、型特性 (type traits)、コンパイル時有理数演算、コンパイル時整数シーケンスといったメタプログラミング機能を提供します。
目次 |
[編集] 定義
以下の型は総称して参照可能な型 (referenceable types) と呼ばれます
任意の参照可能な型 T に対して、その参照を作成することができます[1]。
[編集] 型特性
型特性は、型のプロパティを問い合わせるための、コンパイル時テンプレートベースのインターフェースを定義します。
<type_traits> ヘッダで定義され、このページに記載されているテンプレートを特殊化しようとすると、未定義の動作となります。ただし、std::common_type および std::basic_common_reference(C++20以降) は、説明で要求される通りに特殊化することができます。
標準ライブラリテンプレートを不完全な型でインスタンス化することに対する一般的な禁止にもかかわらず、<type_traits> ヘッダで定義されたテンプレートは、特に指定がない限り不完全な型でインスタンス化されることがあります。
[編集] 基底クラス
ほとんどの非変換型特性は、UnaryTypeTrait または BinaryTypeTrait の要件を満たすために、std::integral_constant から公開かつ曖昧さなく派生する必要があります。
| ヘッダ
<type_traits> で定義 | |
| (C++11)(C++17) |
指定された値を持つ、指定された型のコンパイル時定数 (クラステンプレート) |
std::integral_constant の bool 型に対する2つの特殊化が提供されます
| ヘッダ
<type_traits> で定義 | |
| 型 | 定義 |
true_type
|
std::integral_constant<bool, true> |
false_type
|
std::integral_constant<bool, false> |
[編集] 単項型特性
単項型特性は、型のブール値プロパティをコンパイル時に問い合わせるために使用できます。
これらの型特性はすべて UnaryTypeTrait を満たし、各型特性の基本特性は、対応する条件が満たされるかどうかに応じて std::true_type または std::false_type のいずれかです。
主要な型カテゴリ | |
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
型が void であるかをチェックする (クラステンプレート) |
| (C++11)(DR*) |
型が std::nullptr_t であるかをチェックする (クラステンプレート) |
| (C++11) |
型が整数型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が浮動小数点型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が配列型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が列挙型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が共用体型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が共用体でないクラス型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が関数型であるかをチェックする (クラステンプレート) |
| (C++11) |
型がポインタ型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が左辺値参照であるかをチェックする (クラステンプレート) |
| (C++11) |
型が右辺値参照であるかをチェックする (クラステンプレート) |
| (C++11) |
型が非静的メンバオブジェクトポインタであるかをチェックする (クラステンプレート) |
| (C++11) |
型が非静的メンバ関数ポインタであるかをチェックする (クラステンプレート) |
複合型カテゴリ | |
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
型が基本型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が算術型であるかをチェックする (クラステンプレート) |
| (C++11) |
型がスカラ型であるかをチェックする (クラステンプレート) |
| (C++11) |
型がオブジェクト型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が複合型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が左辺値参照または右辺値参照であるかをチェックする (クラステンプレート) |
| (C++11) |
型が非静的メンバ関数またはオブジェクトへのポインタであるかをチェックする (クラステンプレート) |
型のプロパティ | |
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
型がconst修飾されているかをチェックする (クラステンプレート) |
| (C++11) |
型がvolatile修飾されているかをチェックする (クラステンプレート) |
| (C++11)(C++26で非推奨) |
型がトリビアルであるかをチェックする (クラステンプレート) |
| (C++11) |
型がトリビアルにコピー可能であるかをチェックする (クラステンプレート) |
| (C++11) |
型がスタンダードレイアウト型であるかをチェックする (クラステンプレート) |
| (C++11)(C++20で非推奨) |
型がplain-old data (POD) 型であるかをチェックする (クラステンプレート) |
| (C++11)(C++17で非推奨)(C++20で削除) |
型がリテラル型であるかをチェックする (クラステンプレート) |
| 型のオブジェクト表現の全てのビットがその値に寄与するかをチェックする (クラステンプレート) | |
| (C++11) |
型が非静的データメンバを持たないクラス型(共用体ではない)であるかをチェックする (クラステンプレート) |
| (C++11) |
型が多態的なクラス型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が抽象クラス型であるかをチェックする (クラステンプレート) |
| (C++14) |
型がfinalクラス型であるかをチェックする (クラステンプレート) |
| (C++17) |
型が集約型であるかをチェックする (クラステンプレート) |
| (C++23) |
型が暗黙的生存期間型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が符号付き算術型であるかをチェックする (クラステンプレート) |
| (C++11) |
型が符号なし算術型であるかをチェックする (クラステンプレート) |
| (C++20) |
型が既知の境界を持つ配列型であるかをチェックする (クラステンプレート) |
| (C++20) |
型が未知の境界を持つ配列型であるかをチェックする (クラステンプレート) |
| (C++23) |
型がスコープ付き列挙型であるかをチェックする (クラステンプレート) |
サポートされている操作 | |
| ヘッダ
<type_traits> で定義 | |
| (C++11)(C++11)(C++11) |
型が特定の引数に対するコンストラクタを持つかをチェックする (クラステンプレート) |
| 型がデフォルトコンストラクタを持つかをチェックする (クラステンプレート) | |
| (C++11)(C++11)(C++11) |
型がコピーコンストラクタを持つかをチェックする (クラステンプレート) |
| (C++11)(C++11)(C++11) |
型が右辺値参照から構築可能であるかをチェックする (クラステンプレート) |
| (C++11)(C++11)(C++11) |
型が特定の引数に対する代入演算子を持つかをチェックする (クラステンプレート) |
| (C++11)(C++11)(C++11) |
型がコピー代入演算子を持つかをチェックする (クラステンプレート) |
| (C++11)(C++11)(C++11) |
型がムーブ代入演算子を持つかをチェックする (クラステンプレート) |
| (C++11)(C++11)(C++11) |
型が非削除デストラクタを持つかをチェックする (クラステンプレート) |
| (C++11) |
型が仮想デストラクタを持つかをチェックする (クラステンプレート) |
| (C++17)(C++17)(C++17)(C++17) |
型のオブジェクトが同じまたは異なる型のオブジェクトとスワップ可能であるかをチェックする (クラステンプレート) |
| 直接初期化において参照が一時オブジェクトに束縛されるかをチェックする (クラステンプレート) | |
| コピー初期化において参照が一時オブジェクトに束縛されるかをチェックする (クラステンプレート) | |
[編集] プロパティクエリ
プロパティクエリ特性は、型の整数プロパティをコンパイル時に問い合わせるために使用できます。
これらの型特性はすべて UnaryTypeTrait を満たし、各型特性の基本特性は std::integral_constant<std::size_t, Value> であり、ここで Value は対応するプロパティのクエリ結果です。
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
型のアライメント要件を取得する (クラステンプレート) |
| (C++11) |
配列型の次元数を取得する (クラステンプレート) |
| (C++11) |
指定された次元に沿った配列型のサイズを取得する (クラステンプレート) |
[編集] 型関係
型関係特性は、型間の関係をコンパイル時に問い合わせるために使用できます。
これらの型特性はすべて BinaryTypeTrait を満たし、各型特性の基本特性は、対応する条件が満たされるかどうかに応じて std::true_type または std::false_type のいずれかです。
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
2つの型が同じであるかをチェックする (クラステンプレート) |
| (C++11) |
ある型が他の型の基底であるかをチェックする (クラステンプレート) |
| (C++26) |
ある型が他の型の仮想基底であるかをチェックする (クラステンプレート) |
| (C++11)(C++20) |
ある型が他の型に変換可能であるかをチェックする (クラステンプレート) |
| (C++20) |
2つの型がレイアウト互換であるかをチェックする (クラステンプレート) |
| ある型が他の型のポインタ相互変換可能な(初期)基底であるかをチェックする (クラステンプレート) | |
| ある型が与えられた引数型で(std::invokeのように)呼び出し可能であるかをチェックする (クラステンプレート) | |
[編集] 型変換
型変換特性は、事前定義されたいくつかのルールに従って、ある型を別の型に変換します。
これらの型特性はすべて TransformationTrait を満たします。
const-volatile修飾子 | |
| ヘッダ
<type_traits> で定義 | |
| (C++11)(C++11)(C++11) |
与えられた型から const および/または volatile 修飾子を削除する (クラステンプレート) |
| (C++11)(C++11)(C++11) |
与えられた型に const および/または volatile 修飾子を追加する (クラステンプレート) |
参照 | |
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
与えられた型から参照を削除する (クラステンプレート) |
| (C++11)(C++11) |
与えられた型に左辺値または右辺値参照を追加する (クラステンプレート) |
符号修飾子 | |
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
与えられた整数型に対応する符号付き型を取得する (クラステンプレート) |
| (C++11) |
与えられた整数型に対応する符号付き型を取得する (クラステンプレート) |
配列 | |
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
与えられた配列型から1つの次元を削除する (クラステンプレート) |
| (C++11) |
与えられた配列型からすべての次元を削除する (クラステンプレート) |
ポインタ | |
| ヘッダ
<type_traits> で定義 | |
| (C++11) |
与えられた型からポインタを削除する (クラステンプレート) |
| (C++11) |
与えられた型にポインタを追加する (クラステンプレート) |
その他の変換 | |
| ヘッダ
<type_traits> で定義 | |
| (C++11以降)(C++23で非推奨) |
与えられたサイズの型の未初期化ストレージとして使用するのに適した型を定義する (クラステンプレート) |
| (C++11以降)(C++23で非推奨) |
与えられたすべての型の未初期化ストレージとして使用するのに適した型を定義する (クラステンプレート) |
| (C++11) |
関数引数を値渡しする際の型変換を適用する (クラステンプレート) |
| (C++20) |
std::remove_cv と std::remove_reference を組み合わせる (クラステンプレート) |
| (C++11) |
条件に応じて関数のオーバーロードやテンプレートの特殊化をオーバーロード解決から除外する (クラステンプレート) |
| (C++11) |
コンパイル時のブール値に基づいて一方の型または他方の型を選択する (クラステンプレート) |
| (C++11) |
型のグループの共通の型を決定する (クラステンプレート) |
| 型のグループの共通の参照型を決定する (クラステンプレート) | |
| (C++11) |
与えられた列挙型の基底となる整数型を取得する (クラステンプレート) |
| (C++11)(C++20で削除)(C++17) |
呼び出し可能オブジェクトを引数のセットで呼び出した結果の型を推論する (クラステンプレート) |
| (C++17) |
void可変引数エイリアステンプレート (エイリアステンプレート) |
| (C++20) |
型引数を変更せずに返す (クラステンプレート) |
[編集] 論理演算 (C++17以降)
論理演算子特性は、他の型特性に論理演算子を適用します。
| ヘッダ
<type_traits> で定義 | |
| (C++17) |
可変長論理ANDメタ関数 (クラステンプレート) |
| (C++17) |
可変長論理ORメタ関数 (クラステンプレート) |
| (C++17) |
論理NOTメタ関数 (クラステンプレート) |
[編集] メンバ関係 (C++20以降)
| ヘッダ
<type_traits> で定義 | |
| ある型のオブジェクトが、その型の指定されたサブオブジェクトとポインタ相互変換可能であるかをチェックする (関数テンプレート) | |
| (C++20) |
2つの指定されたメンバが、2つの指定された型の共通初期シーケンスにおいて互いに対応するかをチェックする (関数テンプレート) |
[編集] コンパイル時有理数演算
ヘッダ <ratio> は、コンパイル時の比率を操作および格納するための型と関数を提供します。
[編集] コンパイル時整数シーケンス (C++14以降)
| ヘッダ
<utility> で定義 | |
| (C++14) |
コンパイル時の整数シーケンスを実装する (クラステンプレート) |