Namespaces
Variants

std::meta::annotations_of

来自 zh.cppreference.net
< cpp | meta
 
 
 
反射库
 
反射类型与查询
反射查询
反射布局查询
类型属性
类型属性查询
 
定义于头文件 <meta>
consteval std::vector<std::meta::info> annotations_of( std::meta::info item );
(C++26 起)

返回包含应用于 注解的反射的 vector,这些注解适用于 item 所表示的实体。

如果 item 表示函数 P 的一个F函数参数S,那么令 F 为声明集合,忽略任何显式实例化,这些声明可从求值上下文中的某个点到达,并且声明了 F 或 P 为其特化的模板函数,则结果包含在 S 的每个声明中适用于

的所有注解的反射。 item如果 表示一个直接基类关系,则结果包含适用于对应 基类说明符

的所有注解的反射。 R1对于返回的 vector 中的任意两个反射 R2 和 R1,如果 R2 所表示的注解先于 R1 所表示的注解,那么 R2 在 vector 中位于 R1 之前。如果 R2 和 T 表示来自同一翻译单元的注解,则返回的 vector 中 R1 和 R2 之间的任何元素都表示来自 T 的注解。否则顺序未指定。

参数

item - 一个反射值

返回值

一个包含适用于 item 所表示实体的注解的反射的 vector。

异常

抛出 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

参阅

获取应用于反射实体且具有指定类型的注解
(函数)
检查反射是否表示一个 注解
(函数)
获取反射实体常量值的反射
(函数)
(C++26)
获取反射实体类型的反射
(函数)