Spec-Zone.ru › C++

std::meta::extract

Определён в заголовке <meta>
template<class T>
consteval T extract( std::meta::info r );
(начиная с C++26)

Извлекает значение того, что представляет r, как значение типа T.

Пусть UT — это std::remove_cv_t<T>. Результат определяется следующим образом:

  • Если T является ссылочным типом:
    • Если r представляет объект, возвращает ссылку на этот объект.
    • В противном случае r должен представлять переменную; возвращает ссылку на объект этой переменной.
  • В противном случае, если r представляет нестатический член данных или функцию:
    • Если UT является типом указателя, возвращает указатель на функцию, представленную r.
    • В противном случае UT должен быть типом указателя на член; возвращает значение указателя на член, указывающее на сущность, представленную r.
  • В противном случае:
    • возвращает static_cast<UT>([:R:]), где R — константное выражение, равное std::meta::constant_of(r).

Тип T и тип того, что представляет r, могут различаться лишь ограниченным образом. Подробности см. в разделе #Exceptions.

Параметры

r - значение отражения

Возвращаемое значение

Значение того, что представляет r, как описано выше.

Исключения

Выбрасывает std::meta::exception, если не выполнено следующее:

  • Если T является ссылочным типом, выполняются все следующие условия:
    • r представляет переменную или объект.
    • Пусть RT — тип сущности, представленной r. Значения типа RT могут быть преобразованы в T только посредством преобразования квалификации.
    • Если r представляет переменную, то эта переменная либо может использоваться в константных выражениях, либо её время жизни началось в ходе вычисления текущего основного константного выражения.
  • В противном случае, если r представляет нестатический член данных или функцию:
  • Если r представляет нестатический член данных типа X, являющийся непосредственным членом класса C:
    • Член не является битовым полем, UT и X C::* являются подобными типами, а std::is_convertible_v<X C::*, UT> является true.
  • Если r представляет неявную функцию-член с объектом типа F, являющуюся непосредственным членом класса C:
    • Значения типа F C::* могут быть преобразованы в UT только посредством преобразования указателя на функцию.
  • В противном случае r представляет функцию, не являющуюся членом, статическую функцию-член или функцию-член с явным объектом функционального типа F:
    • Значения типа F* могут быть преобразованы в UT только посредством преобразования указателя на функцию.
  • В противном случае выполняются все следующие условия:
  • Выражение std::meta::constant_of(r) не выбрасывает исключение.
  • Пусть RT — тип сущности, представленной std::meta::constant_of(r); выполняется одно из следующих условий:
    • RT является типом указателя, UT и RT являются либо подобными типами, либо оба являются типами указателя на функцию, а std::is_convertible_v<RT, UT> является true.
    • RT не является типом указателя, а типы UT и RT без cv-квалификаторов совпадают.
    • RT является типом массива, UT является типом указателя, std::remove_extent_t<RT>* и UT являются подобными типами, а значение, представленное std::meta::constant_of(r), преобразуемо в UT.
    • RT является типом замыкания, UT является типом указателя на функцию, а значение, представленное std::meta::constant_of(r), преобразуемо в UT.

Пример

См. также

  • Спецификаторы вставки

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/extract

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API