std::meta::annotations_of
来自 zh.cppreference.net
| 定义于头文件 <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) |
获取应用于反射实体且具有指定类型的注解 (函数) |
(C++26) |
检查反射是否表示一个 注解 (函数) |
(C++26) |
获取反射实体常量值的反射 (函数) |
(C++26) |
获取反射实体类型的反射 (函数) |