Namespaces
Variants

Extensions for reflection

From cppreference.net
Extensions for reflection
Concepts
Meta-object operations
Variable
FunctionParameter
Callable
Variable and Callable
Namespace and Callable
ParenthesizedExpression
FunctionCallExpression
FunctionalConversion
Variable and Function

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 に対して リフレクション関連 である

  1. A B が同一のエンティティまたはエイリアスである場合、
  2. A が変数または列挙子であり、 B A の型である場合、
  3. A が列挙型であり、 B A の基底型である場合、
  4. A がクラスであり、 B A のメンバーまたは基底クラスである場合、
  5. A が非テンプレートエイリアスであり、エンティティ B を指定している場合、
  6. A がグローバル名前空間ではなく、 B A を囲むクラスまたは名前空間である場合、
  7. A が括弧で囲まれた式 ( B ) である場合、
  8. A がクロージャ型 B のラムダキャプチャである場合、
  9. A がラムダキャプチャ B のクロージャ型である場合、
  10. B functional-type-conv-expression A によって指定される型である場合、
  11. B function-call-expression A に対するオーバーロード解決で選択された関数である場合、
  12. B が関数 A の戻り値の型、パラメータ型、または関数型である場合、または
  13. 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指定子によって示され、かつオペランドが以下の場合に 依存型 となります:
    • 型依存式、または少なくとも1つの型依存の直接部分式を持つ(括弧で囲まれた可能性のある) functional-type-conv-expression である場合、または
    • 依存型、 未知の特殊化 のメンバー、または 値依存定数式 を指定する場合。

キーワード

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)
メタオブジェクト型が function-call-expression を反映することを指定する
(コンセプト)
メタオブジェクト型が 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
Object 操作
(reflection TS)
2つのメタオブジェクト型が同一のエンティティまたはエイリアスを反映しているかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクトされたエンティティまたはエイリアスの宣言の推定行番号を取得する
(クラステンプレート)
(reflection TS)
リフレクトされたエンティティまたはエイリアスの宣言の実装定義の列番号を取得する
(クラステンプレート)
(reflection TS)
リフレクションされたエンティティまたはエイリアスの宣言の推定ファイル名を取得する
(クラステンプレート)
ObjectSequence 操作
(reflection TS)
メタオブジェクトシーケンスのサイズを取得する
(クラステンプレート)
(reflection TS)
指定されたインデックスのメタオブジェクト型をシーケンスから取得する
(クラステンプレート)
(reflection TS)
メタオブジェクトシーケンスにテンプレートを適用する
(クラステンプレート)
Named 操作
(reflection TS)
リフレクションされたエンティティまたはエイリアスが無名かどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクトされたエンティティまたはエイリアスの非修飾名を取得する
(クラステンプレート)
(reflection TS)
リフレクションされたエンティティまたはエイリアスの実装定義の表示名を取得する
(クラステンプレート)
Alias 操作
(reflection TS)
リフレクトされたエイリアスの関連エンティティを反映するメタオブジェクト型を取得する
(クラステンプレート)
Type 操作
(reflection TS)
リフレクションされたエンティティまたはエイリアスの型を反映するメタオブジェクト型を取得する
(クラステンプレート)
(reflection TS)
リフレクトされたエンティティまたはエイリアスの型を取得する
(クラステンプレート)
(reflection TS)
メタオブジェクト型が列挙型を反映しているかどうかをチェックする
(クラステンプレート)
(reflection TS)
メタオブジェクト型が共用体型を反映しているかどうかをチェックする
(クラステンプレート)
メタオブジェクト型が、それぞれ class または struct を使用して宣言された非共用体クラス型を反映しているかどうかをチェックする
(クラステンプレート)
ScopeMember 操作
(reflection TS)
反映されたエンティティまたはエイリアスのスコープを反映するメタオブジェクト型を取得する
(クラステンプレート)
Base operations
(reflection TS)
指定された基底クラス関係における基底クラスを反映するメタオブジェクト型を取得する
(クラステンプレート)
RecordMember および Base 操作
(reflection TS)
リフレクションされたメンバまたは基底クラスがpublicかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクションされたメンバーまたは基底クラスがprotectedかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクションされたメンバーまたは基底クラスがprivateかどうかをチェックする
(クラステンプレート)
Record 操作
リフレクションされたクラスのpublic、アクセス可能、または全てのデータメンバーを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
リフレクションされたクラスのpublic、アクセス可能、または全てのメンバー関数を反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
(reflection TS)
リフレクトされたクラスの全てのコンストラクタを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
(reflection TS)
リフレクトされたクラスで宣言された全ての演算子関数と変換関数を反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
(reflection TS)
リフレクトされたクラスのデストラクタを反映するメタオブジェクト型を取得する
(クラステンプレート)
公開、アクセス可能、またはすべてのネストされた型またはメンバーtypedefを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
メタオブジェクトシーケンス型を取得し、その要素は反映されたクラスのpublic、accessible、またはすべての基底クラスを反映する
(クラステンプレート)
Enum 操作
(reflection TS)
リフレクションされた列挙型がスコープ付きかどうかをチェックする
(クラステンプレート)
(reflection TS)
反映された列挙型の列挙子を反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
(reflection TS)
リフレクトされた列挙型の基盤となる型を反映するメタオブジェクト型を取得する
(クラステンプレート)
Variable 操作
(reflection TS)
定数式であるリフレクトされた変数の値を取得する
(クラステンプレート)
(reflection TS)
変数が thread_local で宣言されているかどうかをチェックする
(クラステンプレート)
FunctionParameter 操作
(reflection TS)
リフレクトされたパラメータがデフォルト引数を持つかどうかをチェックする
(クラステンプレート)
Callable 操作
(reflection TS)
反映された関数のパラメータを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
(reflection TS)
リフレクションされた関数のパラメータリストが省略記号パラメータを含むかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクトされた関数が例外を投げないかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクションされた関数が削除されているかどうかをチェックする
(クラステンプレート)
Variable および Callable 操作
(reflection TS)
リフレクトされた変数または関数がconstexprかどうかをチェックする
(クラステンプレート)
Namespace および Callable 操作
(reflection TS)
リフレクトされた名前空間または関数がインラインかどうかをチェックする
(クラステンプレート)
ParenthesizedExpression 操作
(reflection TS)
括弧で囲まれた式のメタオブジェクト型を反映する非括弧化された式を取得する
(クラステンプレート)
FunctionCallExpression 操作
(reflection TS)
リフレクションされた function-call-expression 内の関数を反映するメタオブジェクト型を取得する
(クラステンプレート)
FunctionalTypeConversion 操作
(reflection TS)
リフレクションされた functional-type-conv-expression 内のコンストラクタを反映するメタオブジェクト型を取得する
(クラステンプレート)
Variable および Function 操作
(reflection TS)
反映された変数または関数のアドレス、または反映された非静的メンバーへのメンバーへのポインタ値を取得する
(クラステンプレート)
MemberFunction 操作
リフレクションされたメンバー関数がそれぞれ const volatile & または && 修飾子で宣言されているかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクトされたメンバー関数が基底クラスのメンバー関数をオーバーライドするかどうかをチェックします
(クラステンプレート)
Record および MemberFunction 操作
(reflection TS)
リフレクトされたクラスまたはメンバー関数が final でマークされているかどうかをチェックする
(クラステンプレート)
Variable および MemberFunction 操作
(reflection TS)
リフレクトされた変数が静的ストレージ期間を持つか、またはリフレクトされたメンバー関数が静的であるかをチェックする
(クラステンプレート)
SpecialMemberFunction operations
(reflection TS)
リフレクトされた特殊メンバ関数が暗黙的に宣言されているかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクトされた特殊メンバ関数がその最初の宣言でデフォルト化されているかどうかをチェックする
(クラステンプレート)
Constructor および ConversionOperator 操作
(reflection TS)
リフレクトされたコンストラクタまたは変換関数が explicit で宣言されているかどうかをチェックする
(クラステンプレート)
MemberFunction および Destructor 操作
(reflection TS)
リフレクションされたメンバー関数が仮想関数かどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクトされたメンバー関数が純粋仮想関数かどうかをチェックする
(クラステンプレート)
Lambda 操作
(reflection TS)
リフレクトされたクロージャ型のキャプチャを反映するメタオブジェクトシーケンス型を取得する
(クラステンプレート)
リフレクトされたクロージャ型のラムダ式のキャプチャデフォルトがそれぞれ = または & であるかどうかをチェックする
(クラステンプレート)
(reflection TS)
リフレクトされたクロージャ型の operator() const で宣言されているかどうかをチェックする
(クラステンプレート)
LambdaCapture 操作
(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演算子によって返されるクラス
(クラス)
コンパイル時型情報ユーティリティ