Namespaces
Variants

std::meta::data_member_spec

С ru.cppreference.net
< cpp | meta
 
 
 
Библиотека рефлексии
Запросы доступности членов
Идентификация области видимости
Запросы членов рефлексии
Рефлексия аннотаций
Извлечение значений
Подстановка рефлексии
Рефлексия результата выражения
Генерация определения класса

Основные категории типов
Составные категории типов
Свойства типов ➜
Отношения типов
 
Типы и запросы рефлексии
Запросы рефлексии
Запросы размещения рефлексии
Свойства типов
Запросы свойств типов
 
Определён в заголовке <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)
1) Возвращает отражение описания элемента данных, которое можно материализовать как элемент данных класса с помощью std::meta::define_aggregate.
2) Тип параметра 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)
1) Создаёт имя из UTF-8 строки std::u8string(std::forward<T>(value)).
2) Создаёт имя из строки 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!

См. также

проверяет, представляет ли отражение описание элемента данных
(функция)
определяет агрегатный тип из последовательности описаний элементов данных
(шаблон функции)