Spec-Zone.ru › C++

std::meta::annotations_of

Определён в заголовке <meta>
consteval std::vector<std::meta::info> annotations_of( std::meta::info item );
(начиная с C++26)

Возвращает вектор, содержащий отражения аннотаций, применимых к сущности, представленной item.

Если item представляет параметр функции P функции F, то пусть S будет множеством объявлений, игнорируя любые явные инстанцирования, достижимых из точки в контексте вычисления и объявляющих либо F, либо шаблонную функцию, специализацией которой является F; результат содержит отражения всех аннотаций, применимых к P в каждом объявлении из S.

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

Для любых двух отражений R1 и R2 в возвращённом векторе, если аннотация, представленная R1, предшествует аннотации, представленной R2, то R1 находится в векторе перед R2. Если R1 и R2 представляют аннотации из одной единицы трансляции T, любые элементы между R1 и R2 в возвращённом векторе представляют аннотации из T. В остальных случаях порядок не определён.

Параметры

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

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

вектор, содержащий отражения аннотаций, применимых к тому, что представляет item.

Исключения

Выбрасывает std::meta::exception, если item не представляет один из следующих элементов:

  • тип
  • псевдоним типа
  • переменная
  • функция
  • параметр функции
  • пространство имён
  • элемент перечисления
  • отношение прямого базового класса
  • нестатический член данных

Пример

#include <meta>
#include <print>

template<class T>
struct [[=42]] D {};

constexpr std::meta::info a1 = std::meta::annotations_of(^^D<int>)[0];
constexpr std::meta::info a2 = std::meta::annotations_of(^^D<char>)[0];
static_assert(a1 != a2);
static_assert(std::meta::constant_of(a1) == std::meta::constant_of(a2));

[[=1]] int x, y;
static_assert(std::meta::annotations_of(^^x)[0] == std::meta::annotations_of(^^y)[0]);

int main()
{
    [[=3.14]] typedef int var;
    typedef int var [[=42]];

    static constexpr auto annotations =
        std::define_static_array(std::meta::annotations_of(^^var));
    template for (constexpr auto ann : annotations) {
        std::println("{}", [:std::meta::constant_of(ann):]);
    }
}

Вывод:

3.14
42

См. также

annotations_of_with_type
(C++26)
получает аннотации указанного типа, применимые к отражённой сущности
(функция)
is_annotation
(C++26)
проверяет, представляет ли отражение аннотацию
(функция)
constant_of
(C++26)
получает отражение постоянного значения отражённой сущности
(функция)
type_of
(C++26)
определяет тип отражённой сущности
(функция)

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

Spec-Zone.ru

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