std::meta::data_member_spec
| Определён в заголовке <meta>
|
||
consteval std::meta::info
data_member_spec( std::meta::info type, std::meta::data_member_options options );
|
(1) | (начиная с C++26) |
struct data_member_options
{
std::optional</*name-type*/> name;
std::optional<int> alignment;
std::optional<int> bit_width;
bool no_unique_address = false;
std::vector<std::meta::info> annotations;
};
|
(2) | (начиная с C++26) |
data_member_options является агрегатным типом. Он не является структурным типом, и объекты этого типа могут использоваться только во время компиляции.Описание элемента данных обычно представляется в виде шестёрки (T, N, A, W, NUA, ANN), где:
- T — тип, представленный
std::meta::dealias(type). - N — либо идентификатор, закодированный в
options.name, либо специальное значение (обозначенное ⊥), еслиoptions.nameне содержит значения. - A — значение выравнивания, содержащееся в
options.alignment, либо специальное значение (⊥), еслиoptions.alignmentне содержит значения. - W — значение, содержащееся в
options.bit_width, либо специальное значение (⊥), еслиoptions.bit_widthне содержит значения. - NUA — значение
options.no_unique_address. - ANN — последовательность значений
std::meta::constant_of(r)для каждогоrвoptions.annotations.
Два описания элемента данных равны, если каждая из их соответствующих компонент являются одними и теми же сущностями, одними и теми же идентификаторами, имеют равные значения или обе равны ⊥. Два отражения описаний элемента данных сравниваются равными, если представляемые ими описания равны.
Если комбинация аргументов недопустима, выбрасывается std::meta::exception. Подробности см. в разделе Исключения ниже.
Тип, обозначаемый на черновике как /*name-type*/, является типом класса со следующими конструкторами:
std::meta::data_member_options::name-type::name-type
template< class T >
requires std::constructible_from<std::u8string, T>
consteval /*name-type*/( T&& value );
|
(1) | |
template< class T >
requires std::constructible_from<std::string, T>
consteval /*name-type*/( T&& value );
|
(2) | |
std::u8string(std::forward<T>(value)).std::string(std::forward<T>(value)) в обычной кодировке литералов.Параметры
| type | - | тип определяемого элемента данных |
| options | - | прочие характеристики определяемого элемента данных |
Возвращаемое значение
Отражение, представляющее описание элемента данных, созданное на основе аргументов.
Исключения
Выбрасывает std::meta::exception, если не выполнены все следующие условия:
std::meta::dealias(type)представляет тип объекта или ссылочный тип.- Если
options.nameсодержит значение:
- Если имя было создано из UTF-8 строки, строка является написанием корректного токена, и токен является допустимым идентификатором при интерпретации в UTF-8.
- В противном случае (имя было создано из обычной строки), строка является написанием корректного токена, и токен является допустимым идентификатором при интерпретации в обычной кодировке литералов.
- Если
options.nameне содержит значения,options.bit_widthсодержит значение. (В этом случае результат описывает безымянное битовое поле.) - Если
options.bit_widthсодержит значение V, то:
std::meta::is_integral(type) || std::meta::is_enum_type(type)истинно.options.alignmentсодержит значение.options.no_unique_addressложно.- V неотрицательно.
- Если V равно нулю,
options.nameне содержит значения.
- Если
options.alignmentсодержит значение, оно является допустимым значением выравнивания и не меньшеstd::meta::alignment_of(type). - Для каждого элемента
rвoptions.annotations,std::meta::type_of(r)является допустимым и представляет не являющийся массивом тип объекта, и вычислениеstd::meta::constant_of(r)не выбрасывает исключение.
Пример
#include <format>
#include <meta>
#include <print>
#include <string>
// Defines struct A as if by “struct A { std::string x; };”
struct A;
consteval
{
std::meta::define_aggregate(^^A,
{
std::meta::data_member_spec(^^std::string, {.name = "x"}),
});
}
// Defines a simple tuple type
template<typename... Ts>
struct Tuple
{
struct Storage;
consteval
{
std::vector<std::meta::info> member_specs;
template for (int i{}; auto type : {^^Ts...})
{
member_specs.push_back(data_member_spec(type, {.name = std::format("item{}", i)}));
++i;
}
define_aggregate(^^Storage, member_specs);
}
Storage data;
Tuple(): data{} {}
Tuple(const Ts& ...values): data{values...} {}
};
int main()
{
A a;
a.x = "Hello";
Tuple<char, char, char, int> t('C', '+', '+', 26);
std::println("{}, {}{}{}{}!", a.x, t.data.item0, t.data.item1, t.data.item2, t.data.item3);
}
Вывод:
Hello, C++26!
См. также
(C++26) |
проверяет, представляет ли отражение описание элемента данных (функция) |
(C++26) |
определяет агрегатный тип из последовательности описаний элементов данных (шаблон функции) |