Metaprogramming library (since C++11)
C++は、型特性、コンパイル時有理数演算、コンパイル時整数シーケンスなどのメタプログラミング機能を提供します。
目次 |
定義
以下の型は総称して referenceable types と呼ばれます:
任意の参照可能な型
T
に対して、その型への参照を作成できます
[1]
。
- ↑ 参照型の場合、これは reference collapsing によって実現できます。
型特性
型特性は、型のプロパティを問い合わせるためのコンパイル時テンプレートベースのインターフェースを定義します。
このページに記載されている <type_traits> ヘッダーで定義されたテンプレートの特殊化を試みると未定義動作を引き起こします。ただし、 std::common_type および std::basic_common_reference (C++20以降) は、説明で要求される場合に限り特殊化が可能です。
<type_traits> ヘッダーで定義されるテンプレートは、特に指定がない限り、不完全型でインスタンス化することが可能です。これは、不完全型による標準ライブラリテンプレートのインスタンス化に関する一般的な禁止事項にかかわらず適用されます。
基底クラス
非変換型特性のほとんどは、 std::integral_constant から公的にかつ明確に派生している必要があり、これにより UnaryTypeTrait または BinaryTypeTrait の要件を満たすことができます。
|
定義済みヘッダー
<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)
|
型が
lvalue reference
かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が
rvalue reference
であるかどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が非静的メンバオブジェクトポインタかどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が非静的メンバ関数ポインタかどうかをチェックする
(クラステンプレート) |
複合型カテゴリ |
|
|
ヘッダーで定義
<type_traits>
|
|
|
(C++11)
|
型が基本型かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が算術型かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型がスカラー型かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型がオブジェクト型かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が複合型かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が
lvalue reference
または
rvalue reference
のいずれかであるかどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が非静的メンバー関数またはオブジェクトへのポインタかどうかをチェックする
(クラステンプレート) |
型プロパティ |
|
|
ヘッダーで定義
<type_traits>
|
|
|
(C++11)
|
型がconst修飾されているかどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型がvolatile修飾されているかどうかをチェックする
(クラステンプレート) |
|
(C++11)
(deprecated in C++26)
|
型がトリビアルかどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型がトリビアルコピー可能かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が
standard-layout
型であるかどうかをチェックする
(クラステンプレート) |
|
(C++11)
(deprecated in C++20)
|
型がプレーンなデータ型(POD)かどうかをチェックする
(クラステンプレート) |
|
(C++11)
(C++17で非推奨)
(C++20で削除)
|
リテラル型かどうかをチェックする
(クラステンプレート) |
|
型のオブジェクト表現内のすべてのビットがその値に寄与するかどうかをチェックする
(クラステンプレート) |
|
|
(C++11)
|
型がクラス型(ただし共用体を除く)であり、非静的データメンバーを持たないかどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型がポリモーフィックなクラス型かどうかをチェックする
(クラステンプレート) |
|
(C++11)
|
型が抽象クラス型かどうかをチェックする
(クラステンプレート) |
|
(C++14)
|
型がfinalクラス型かどうかをチェックする
(クラステンプレート) |
|
(C++17)
|
型が集成体型かどうかをチェックする
(クラステンプレート) |
|
(C++23)
|
型がimplicit-lifetime型かどうかをチェックする
(クラステンプレート) |
|
(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++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-volatility 指定子 |
|
|
ヘッダーで定義
<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)
|
指定された型に
lvalue
または
rvalue
参照を追加する
(クラステンプレート) |
符号修飾子 |
|
|
ヘッダーで定義
<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)
(removed in C++20)
(C++17)
|
呼び出し可能オブジェクトを引数セットで呼び出した結果の型を推論する
(クラステンプレート) |
|
(C++17)
|
void可変長エイリアステンプレート
(エイリアステンプレート) |
|
(C++20)
|
型引数を変更せずに返す
(クラステンプレート) |
論理演算 (C++17以降)
論理演算子トレイトは、他の型特性に論理演算子を適用します。
|
ヘッダーで定義
<type_traits>
|
|
|
(C++17)
|
可変引数論理積メタ関数
(クラステンプレート) |
|
(C++17)
|
可変引数論理和メタ関数
(クラステンプレート) |
|
(C++17)
|
論理否定メタ関数
(クラステンプレート) |
メンバー関係 (since C++20)
|
ヘッダーで定義
<type_traits>
|
|
|
型のオブジェクトがその型の指定された部分オブジェクトと
ポインター相互変換可能
であるかどうかをチェックする
(関数テンプレート) |
|
|
(C++20)
|
2つの指定された型の共通先頭部分列において、2つの指定されたメンバーが互いに対応するかどうかをチェックする
(関数テンプレート) |
コンパイル時有理数演算
ヘッダー <ratio> は、 コンパイル時比の操作と格納のための型と関数 を提供します。
コンパイル時整数シーケンス (C++14以降)
|
定義ヘッダー
<utility>
|
|
|
(C++14)
|
整数のコンパイル時シーケンスを実装する
(クラステンプレート) |