Extensions for reflection
C++リフレクション拡張機能、ISO/IEC TS 23619:2021は、コア言語への変更を規定し、このページに記載されているC++標準ライブラリの新しいコンポーネントを定義します。
Reflection TSはC++20標準に基づいています(ただし、コンセプトの定義は Concepts TS のスタイルで規定されています)。
コア言語の変更
reflexpr-specifier
reflexpr-specifier
は形式
reflexpr
(
reflexpr-operand
)
をとり、メタオブジェクト型を指定します(下記参照)。
reflexpr-operand は以下のいずれかになります:
::
|
(1) | ||||||||
| type-id | (2) | ||||||||
| nested-name-specifier (optional) namespace-name | (3) | ||||||||
| id-expression | (4) | ||||||||
(
expression
)
|
(5) | ||||||||
| function-call-expression | (6) | ||||||||
| functional-type-conv-expression | (7) | ||||||||
where function-call-expression is
後置式
(
式リスト
(オプション)
)
|
|||||||||
and functional-type-conv-expression は、以下の種類の式であり、 explicit cast を実行します:
simple-type-specifier
(
expression-list
(省略可能)
)
|
(1) | ||||||||
typename-specifier
(
expression-list
(省略可能)
)
|
(2) | ||||||||
| simple-type-specifier braced-init-list | (3) | ||||||||
| typename-specifier braced-init-list | (4) | ||||||||
reflexpr指定子のオペランドは、 型 、 名前空間 、 列挙子 、変数、 データメンバ 、 関数パラメータ 、 キャプチャされたエンティティ 、 function-call-expression または functional-type-conv-expression 、および括弧で囲まれた式でなければなりません。 reflexpr ( :: ) はグローバル名前空間を反映します。
reflexprオペランド
が
(
式
)
の形式である場合、
式
は(複数の括弧で囲まれている可能性がある)
function-call-expression
または
functional-type-conv-expression
でなければならない。
括弧で囲まれていないオペランドが
type-id
または
functional-type-conv-expression
のいずれかとして扱える場合、それは
type-id
として扱われます。括弧を使用することで、関数形式キャストと
type-id
の間の曖昧性を解消できます。例えば、デフォルトコンストラクタを持つクラス型
X
が与えられた場合、
reflexpr
(
X
(
)
)
は関数型
X
(
)
を反映し、
reflexpr
(
(
X
(
)
)
)
は式
X
(
)
を反映します。
被演算子がエイリアスとクラス名の両方を指定する場合、reflexpr指定子によって表される型はエイリアスを反映し、
reflect::Alias
を満たします。
オペランドがブロックスコープ内で宣言された名前を指定し、かつその名前付きエンティティがキャプチャも関数パラメータでもない場合、プログラムは不適格です。
メタオブジェクト型
meta-object type
は、名前のない不完全な名前空間スコープのクラス型です。型が
reflect::Object
コンセプトを満たすのは、それがmeta-object typeである場合に限ります。meta-object typeは、
reflexpr
のオペランドに応じて他のコンセプトを満たす場合があります。
同じ被演算子に対して繰り返し
reflexpr
を適用した場合、同じ型が得られるか異なる型が得られるかは未規定です。メタオブジェクト型が不完全なクラス型を反映している場合、特定の型変換を適用することはできません。
meta-object型は、型特性または型変換を通じて、
reflexpr
のオペランドの一部のプロパティの検査を可能にします。
オーバーロード解決
postfix-expression がクラス型である場合、すなわち function-call-expression 内の e が function-call-expression e ( args ) においてクラス型である場合、 postfix-expression の型( e )の user-defined conversion function は使用されてはならない。
postfix-expression がクラス型でない場合、それはオーバーロード解決の唯一の結果である関数を指定しなければならない。
struct Functor { void operator()(int) const; using fptr_t = void(*)(std::nullptr_t); operator fptr_t() const; }; using Meta0 = reflexpr(Functor{}(0)); // 正常 // using Meta1 = reflexpr(Functor{}(nullptr)); // エラー: 変換関数が使用された
alias は、 typedef 宣言、 alias-declaration 、または using-declaration によって導入される名前です。
エンティティまたはエイリアス
B
は、以下の場合にエンティティまたはエイリアス
A
に対して
リフレクション関連
である
-
AとBが同一のエンティティまたはエイリアスである場合、 -
Aが変数または列挙子であり、BがAの型である場合、 -
Aが列挙型であり、BがAの基底型である場合、 -
Aがクラスであり、BがAのメンバーまたは基底クラスである場合、 -
Aが非テンプレートエイリアスであり、エンティティBを指定している場合、 -
Aがグローバル名前空間ではなく、BがAを囲むクラスまたは名前空間である場合、 -
Aが括弧で囲まれた式 (B) である場合、 -
Aがクロージャ型Bのラムダキャプチャである場合、 -
AがラムダキャプチャBのクロージャ型である場合、 -
Bが functional-type-conv-expressionAによって指定される型である場合、 -
Bが function-call-expressionAに対するオーバーロード解決で選択された関数である場合、 -
Bが関数Aの戻り値の型、パラメータ型、または関数型である場合、または -
BがエンティティまたはエイリアスXに関連するリフレクションであり、XがAに関連するリフレクションである場合。
反射関係は反射的かつ推移的ですが、対称的ではありません。
非公式に言えば、
B
が
A
に対してリフレクション関連であるというケースは、
B
が
A
の宣言または定義に参加していることを意味します。
reflexpr-specifier によって示される型に対して、メタオブジェクト型を生成する型変換をゼロ回以上連続して適用することで、オペランドに対してリフレクション関連するエンティティとエイリアスの検査が可能となる。このようなメタオブジェクト型は、対応するリフレクション関連エンティティまたはエイリアスを反映すると言われる。
struct X; struct B { using X = ::X; typedef X Y; }; struct D : B { using B::Y; }; // ::XのみがD::Yとリフレクション関連であり、B::XやB::Yは関連しない
その他
- reflexpr-operand として使用される式は 未評価式 であり、 潜在的に定数評価される 式です。
-
キャプチャデフォルトによる
ラムダ式での変数キャプチャ
の決定において、
reflexprオペランドは未評価オペランドとは見なされません。 -
静的
記憶域期間
を持つ関数または変数がメタオブジェクト型
Tによって反映される場合、その関数または変数は特殊化 std :: experimental :: reflect :: get_pointer < T > によって、関数または変数を指名するid-expressionのアドレスを取得するかのように odr-used されます。 - この型に対するすべての操作が同じ定数式の結果を生成する限り、メタオブジェクト型の定義は複数存在することができます。
- 型は、reflexpr指定子によって示され、かつオペランドが以下の場合に 依存型 となります:
キーワード
事前定義機能テストマクロ
|
__cpp_reflection
(reflection TS)
|
少なくとも
201902
の値はReflection TSがサポートされていることを示す
(マクロ定数) |
ライブラリサポート
コンセプト
|
定義済みヘッダー
<experimental/reflect>
|
|
|
名前空間
std::experimental::reflect
で定義
|
|
|
インライン名前空間で定義
std::experimental::reflect::v1
|
|
|
(reflection TS)
|
メタオブジェクト型であることを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型がメタオブジェクトシーケンス型であることを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型がテンプレートパラメータスコープを反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が関連付けられた(空の場合もある)名前を持つエンティティまたはエイリアスを反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が型エイリアス、名前空間エイリアス、またはusing宣言によって導入されたエイリアスを反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型がクラスの
member-declaration
を反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が列挙子を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が変数またはデータメンバーを反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が
RecordMember
、
Enumerator
または
Variable
を満たすか、グローバル名前空間以外の名前空間を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が型を持つエンティティを反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が名前空間を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型がグローバル名前空間を反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が非共用体クラス型を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が列挙型を反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型がクラス型を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が名前空間、クラス、列挙型、関数、クロージャ型、テンプレートパラメータスコープを反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が型を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が列挙子またはconstexpr変数を反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が
get_base_classes
から取得された直接基底クラスを反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が関数パラメータを反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が関数(コンストラクタおよびデストラクタを含む)を反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が式を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が括弧で囲まれた式を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が
function-call-expression
を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が
functional-type-conv-expression
を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が関数(コンストラクタとデストラクタを除く)を反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型がメンバー関数(コンストラクタとデストラクタを除く)を反映することを指定します
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型が特殊メンバ関数を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型がコンストラクタを反映することを指定する
(コンセプト) |
|
(reflection TS)
|
メタオブジェクト型がデストラクタを反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が演算子関数または変換関数を反映することを指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型が変換関数を反映することを指定する
(コンセプト) |
|
(reflection TS)
|
非ジェネリックラムダのクロージャ型を反映するメタオブジェクト型を指定する
(concept) |
|
(reflection TS)
|
メタオブジェクト型がラムダキャプチャを反映することを指定する
(コンセプト) |
メタオブジェクト操作
|
定義済みヘッダー
<experimental/reflect>
|
|
|
名前空間
std::experimental::reflect
で定義
|
|
|
インライン名前空間で定義
std::experimental::reflect::v1
|
|
|
|
|
(reflection TS)
|
2つのメタオブジェクト型が同一のエンティティまたはエイリアスを反映しているかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたエンティティまたはエイリアスの宣言の推定行番号を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたエンティティまたはエイリアスの宣言の実装定義の列番号を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクションされたエンティティまたはエイリアスの宣言の推定ファイル名を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
メタオブジェクトシーケンスのサイズを取得する
(クラステンプレート) |
|
(reflection TS)
|
指定されたインデックスのメタオブジェクト型をシーケンスから取得する
(クラステンプレート) |
|
(reflection TS)
|
メタオブジェクトシーケンスにテンプレートを適用する
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクションされたエンティティまたはエイリアスが無名かどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたエンティティまたはエイリアスの非修飾名を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクションされたエンティティまたはエイリアスの実装定義の表示名を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされたエイリアスの関連エンティティを反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクションされたエンティティまたはエイリアスの型を反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたエンティティまたはエイリアスの型を取得する
(クラステンプレート) |
|
(reflection TS)
|
メタオブジェクト型が列挙型を反映しているかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
メタオブジェクト型が共用体型を反映しているかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
メタオブジェクト型が、それぞれ
class
または
struct
を使用して宣言された非共用体クラス型を反映しているかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
反映されたエンティティまたはエイリアスのスコープを反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
指定された基底クラス関係における基底クラスを反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクションされたメンバまたは基底クラスがpublicかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクションされたメンバーまたは基底クラスがprotectedかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクションされたメンバーまたは基底クラスがprivateかどうかをチェックする
(クラステンプレート) |
|
|
|
リフレクションされたクラスのpublic、アクセス可能、または全てのデータメンバーを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
|
リフレクションされたクラスのpublic、アクセス可能、または全てのメンバー関数を反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
|
(reflection TS)
|
リフレクトされたクラスの全てのコンストラクタを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたクラスで宣言された全ての演算子関数と変換関数を反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたクラスのデストラクタを反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
公開、アクセス可能、またはすべてのネストされた型またはメンバーtypedefを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
|
メタオブジェクトシーケンス型を取得し、その要素は反映されたクラスのpublic、accessible、またはすべての基底クラスを反映する
(クラステンプレート) |
|
|
|
|
(reflection TS)
|
リフレクションされた列挙型がスコープ付きかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
反映された列挙型の列挙子を反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされた列挙型の基盤となる型を反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
定数式であるリフレクトされた変数の値を取得する
(クラステンプレート) |
|
(reflection TS)
|
変数が
thread_local
で宣言されているかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされたパラメータがデフォルト引数を持つかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
反映された関数のパラメータを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクションされた関数のパラメータリストが省略記号パラメータを含むかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされた関数が例外を投げないかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクションされた関数が削除されているかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされた変数または関数がconstexprかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされた名前空間または関数がインラインかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
括弧で囲まれた式のメタオブジェクト型を反映する非括弧化された式を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクションされた
function-call-expression
内の関数を反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクションされた
functional-type-conv-expression
内のコンストラクタを反映するメタオブジェクト型を取得する
(クラステンプレート) |
|
|
|
(reflection TS)
|
反映された変数または関数のアドレス、または反映された非静的メンバーへのメンバーへのポインタ値を取得する
(クラステンプレート) |
|
|
|
リフレクションされたメンバー関数がそれぞれ
const
、
volatile
、
&
または
&&
修飾子で宣言されているかどうかをチェックする
(クラステンプレート) |
|
|
(reflection TS)
|
リフレクトされたメンバー関数が基底クラスのメンバー関数をオーバーライドするかどうかをチェックします
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされたクラスまたはメンバー関数が
final
でマークされているかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされた変数が静的ストレージ期間を持つか、またはリフレクトされたメンバー関数が静的であるかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされた特殊メンバ関数が暗黙的に宣言されているかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされた特殊メンバ関数がその最初の宣言でデフォルト化されているかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされたコンストラクタまたは変換関数が
explicit
で宣言されているかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクションされたメンバー関数が仮想関数かどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたメンバー関数が純粋仮想関数かどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクトされたクロージャ型のキャプチャを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたクロージャ型のラムダ式のキャプチャデフォルトがそれぞれ
=
または
&
であるかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたクロージャ型の
operator()
が
const
で宣言されているかどうかをチェックする
(クラステンプレート) |
|
|
|
(reflection TS)
|
リフレクションされたラムダキャプチャが明示的にキャプチャされているかどうかをチェックする
(クラステンプレート) |
|
(reflection TS)
|
リフレクトされたラムダキャプチャがinit-captureであるかどうかをチェックする
(クラステンプレート) |
ライブラリ機能テストマクロ
|
定義済みヘッダー
<experimental/reflect>
|
|
|
__cpp_lib_reflection
(reflection TS)
|
少なくとも
201902
の値は、Reflection TSのサポートライブラリがサポートされていることを示す
(マクロ定数) |
コンセプトの充足
以下の表は、オペランドを反映するメタオブジェクト型がReflection TSで導入されたコンセプトを満たすかどうかを示しています。
| カテゴリ |
reflexpr
オペランド
|
満たすコンセプト |
|---|---|---|
| 型 | class-name で union を指定 |
reflect::Union
|
| class-name で クロージャ型 を指定 |
reflect::Lambda
|
|
| class-name で非unionクラスを指定 |
reflect::Record
|
|
| enum-name |
reflect::Enum
|
|
| テンプレート type-parameter |
reflect::Type
,
reflect::Alias
|
|
| decltype-specifier |
reflect::Type
,
reflect::Alias
|
|
| type-name で using宣言 によって導入されたもの |
reflect::Type
,
reflect::Alias
,
reflect::ScopedMember
|
|
| その他の typedef-name |
reflect::Type
,
reflect::Alias
|
|
| その他の type-id |
reflect::Type
|
|
| 名前空間 | namespace-alias |
reflect::Namespace
,
reflect::Alias
|
| グローバル名前空間 |
reflect::GlobalScope
|
|
| その他の 名前空間 |
reflect::Namespace
|
|
| 式 | データメンバの名前 |
reflect::Variable
|
| 変数の名前 |
reflect::Variable
|
|
| 列挙子の名前 |
reflect::Enumerator
|
|
| 関数パラメータの名前 |
reflect::FunctionParameter
|
|
| キャプチャされたエンティティ の名前 |
reflect::LambdaCapture
|
|
| 括弧で囲まれた式 |
reflect::ParenthesizedExpression
|
|
| function-call-expression |
reflect::FunctionCallExpression
|
|
| functional-type-conv-expression |
reflect::FunctionalTypeConversion
|
形式id-expressionのオペランドが定数式である場合、reflexpr-specifierによって指定される型は
reflect::Constant
も満たします。
reflexprオペランドがクラスメンバを指定する場合、reflexpr指定子によって表される型は
reflect::RecordMember
も満たします。
関連項目
|
いくつかの型の情報を含む、typeid演算子によって返されるクラス
(クラス) |
|
|
(C++11)
|
コンパイル時型情報ユーティリティ |