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 основана на стандарте C++20 (за исключением того, что определения концепций заданы в стиле Concepts TS ).

Содержание

Изменения в базовом языке

спецификатор reflexpr

Спецификатор reflexpr имеет форму reflexpr ( операнда reflexpr ) и задаёт тип метаобъекта (см. ниже).

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)
**Примечание:** В соответствии с инструкциями, все C++ специфические термины (`type-id`, `nested-name-specifier`, `namespace-name`, `id-expression`, `expression`, `function-call-expression`, `functional-type-conv-expression`) и HTML-теги оставлены без перевода. Переведены только служебные слова и пояснения.

где function-call-expression является

postfix-expression ( expression-list (необязательно) )

и functional-type-conv-expression являются следующими видами выражений, которые выполняют явное приведение типа :

спецификатор-простого-типа ( список-выражений (необязательно) ) (1)
спецификатор-typename ( список-выражений (необязательно) ) (2)
спецификатор-простого-типа список-инициализации-в-фигурных-скобках (3)
спецификатор-typename список-инициализации-в-фигурных-скобках (4)

Операнд для reflexpr-спецификатора должен быть типом , пространством имён , перечислителем , переменной, членом данных , параметром функции , захваченной сущностью , function-call-expression или functional-type-conv-expression , а также выражением в скобках. reflexpr ( :: ) отражает глобальное пространство имён.

Для reflexpr-операнда вида ( expression ) , expression должен быть (возможно, многократно заключенным в скобки) 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 .

Если операнд обозначает имя, объявление которого заключено в область видимости блока, и именованная сущность не захвачена и не является параметром функции, программа является некорректной.

Типы метаобъектов

Метаобъектный тип — это безымянный, неполный тип класса в области видимости пространства имён. Тип удовлетворяет концепции reflect::Object тогда и только тогда, когда он является метаобъектным типом. Метаобъектные типы могут удовлетворять другим концепциям в зависимости от операнда reflexpr .

Не определено, приводит ли многократное применение reflexpr к одному и тому же операнду к одному и тому же типу или к другому типу. Если тип метаобъекта отражает неполный тип класса, определенные преобразования типов не могут быть применены.

Метаобъектный тип позволяет исследовать некоторые свойства операнда reflexpr с помощью трейтов типов или преобразований типов над ним.

Разрешение перегрузки

Если постфиксное-выражение в выражении-вызова-функции имеет тип класса, т.е. e в выражении-вызова-функции e ( args ) имеет тип класса, то пользовательская функция преобразования типа постфиксного-выражения ( e ) не должна использоваться.

Если postfix-expression не является типом класса, он должен обозначать функцию, которая является уникальным результатом разрешения перегрузки.

struct Functor
{
    void operator()(int) const;
    using fptr_t = void(*)(std::nullptr_t);
    operator fptr_t() const;
};
using Meta0 = reflexpr(Functor{}(0));          // OK
// using Meta1 = reflexpr(Functor{}(nullptr)); // ошибка: использована функция преобразования

Связанные с рефлексией

Псевдоним — это имя, вводимое с помощью typedef -объявления, alias-объявления или using-объявления .

Сущность или псевдоним 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-спецификатором , позволяют исследовать сущности и псевдонимы, которые связаны с рефлексией с операндом; такой метаобъектный тип называется отражающим соответствующую связанную с рефлексией сущность или псевдоним.

struct X;
struct B
{
    using X = ::X;
    typedef X Y;
};
struct D : B
{
    using B::Y;
};
// только ::X, но не B::X или B::Y связаны с рефлексией для D::Y

Разное

Ключевые слова

reflexpr

Предопределенные макросы для тестирования возможностей

__cpp_reflection
(reflection TS)
значение не менее 201902 указывает на поддержку Reflection TS
(макроконстанта)

Поддержка библиотек

Концепции

Определено в заголовочном файле <experimental/reflect>
Определено в пространстве имён std::experimental::reflect
Определено во встроенном пространстве имён std::experimental::reflect::v1
(reflection TS)
определяет, что тип является метаобъектным типом
(concept)
(reflection TS)
определяет, что тип метаобъекта является типом последовательности метаобъектов
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает область параметров шаблона
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает сущность или псевдоним с ассоциированным (возможно, пустым) именем
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает псевдоним типа, псевдоним пространства имён или псевдоним, введённый using-объявлением
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает member-declaration класса
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает перечислитель
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает переменную или член данных
(concept)
(reflection TS)
указывает, что тип метаобъекта удовлетворяет требованиям RecordMember , Enumerator , или Variable , или отражает пространство имен, отличное от глобального пространства имен
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает сущность, имеющую тип
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает пространство имён
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает глобальное пространство имен
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает тип класса, не являющегося объединением
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает тип перечисления
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает тип класса
(concept)
(reflection TS)
определяет, что тип метаобъекта отражает пространство имен, класс, перечисление, функцию, тип замыкания, область параметра шаблона
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает тип
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает перечислитель или constexpr переменную
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает прямой базовый класс, полученный из get_base_classes
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает параметр функции
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает функцию (включая конструкторы и деструкторы)
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает выражение
(concept)
указывает, что тип метаобъекта отражает выражение в скобках
(концепт)
(reflection TS)
указывает, что метаобъектный тип отражает function-call-expression
(концепт)
указывает, что тип метаобъекта отражает functional-type-conv-expression
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает функцию (исключая конструкторы и деструкторы)
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает функцию-член (исключая конструкторы и деструкторы)
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает специальную функцию-член
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает конструктор
(концепт)
(reflection TS)
указывает, что тип метаобъекта отражает деструктор
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает операторную функцию или функцию преобразования
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает функцию преобразования
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает тип замыкания необобщённого лямбда-выражения
(concept)
(reflection TS)
указывает, что тип метаобъекта отражает захват лямбды
(concept)

Метаобъектные операции

Определено в заголовочном файле <experimental/reflect>
Определено в пространстве имён std::experimental::reflect
Определено во встроенном пространстве имён std::experimental::reflect::v1
Object операции
(reflection TS)
проверяет, отражают ли два метаобъектных типа одну и ту же сущность или псевдоним
(шаблон класса)
(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 операции
(reflection TS)
получает тип метаобъекта, отражающий базовый класс в заданном отношении наследования
(шаблон класса)
RecordMember и Base операции
(reflection TS)
проверяет, является ли отражённый член или базовый класс публичным
(шаблон класса)
(reflection TS)
проверяет, является ли отражённый член или базовый класс защищённым
(шаблон класса)
(reflection TS)
проверяет, является ли отражённый член или базовый класс приватным
(шаблон класса)
Record операции
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все члены данных отраженного класса
(шаблон класса)
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все функции-члены отражаемого класса
(шаблон класса)
(reflection TS)
получает тип последовательности метаобъектов, элементы которой отражают все конструкторы отражаемого класса
(шаблон класса)
(reflection TS)
получает тип последовательности метаобъектов, элементы которой отражают все операторные функции и функции преобразования, объявленные в отражаемом классе
(шаблон класса)
(reflection TS)
получает тип метаобъекта, отражающий деструктор отраженного класса
(шаблон класса)
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все вложенные типы или typedef-члены отраженного класса
(шаблон класса)
получает тип последовательности метаобъектов, элементы которой отражают публичные, доступные или все базовые классы отражаемого класса
(шаблон класса)
Enum операции
(reflection TS)
проверяет, является ли отражённое перечисление scoped
(шаблон класса)
(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 операции
(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-захватом
(шаблон класса)

Макросы тестирования возможностей библиотеки

Определено в заголовке <experimental/reflect>
__cpp_lib_reflection
(reflection TS)
значение не менее 201902 указывает, что библиотека поддержки Reflection TS поддерживается
(макроконстанта)

Удовлетворение концепций

В следующей таблице перечислено, удовлетворяет ли тип метаобъекта, отражающий операнд, концепциям, введенным в Reflection TS.

Категория reflexpr операнды Удовлетворяемые концепции
Тип class-name обозначающий union reflect::Union
class-name обозначающий closure type reflect::Lambda
class-name обозначающий класс, не являющийся union reflect::Record
enum-name reflect::Enum
template type-parameter reflect::Type , reflect::Alias
decltype-specifier reflect::Type , reflect::Alias
type-name введённый с помощью using-declaration reflect::Type , reflect::Alias , reflect::ScopedMember
любой другой typedef-name reflect::Type , reflect::Alias
любой другой type-id reflect::Type
Пространство имён namespace-alias reflect::Namespace , reflect::Alias
глобальное пространство имён reflect::GlobalScope
любое другое namespace reflect::Namespace
Выражение имя члена данных reflect::Variable
имя переменной reflect::Variable
имя перечислителя reflect::Enumerator
имя параметра функции reflect::FunctionParameter
имя captured entity reflect::LambdaCapture
выражение в скобках reflect::ParenthesizedExpression
function-call-expression reflect::FunctionCallExpression
functional-type-conv-expression reflect::FunctionalTypeConversion

Если операнд вида id-expression является константным выражением, тип, указанный спецификатором reflexpr, также удовлетворяет reflect::Constant .

Если операнд reflexpr обозначает член класса, тип, представленный спецификатором reflexpr, также удовлетворяет reflect::RecordMember .

Смотрите также

содержит информацию о некотором типе, класс, возвращаемый оператором typeid
(класс)
Утилиты информации о типах во время компиляции