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