std::meta::annotations_of - cppreference.com
来自cppreference.com
consteval std::vector<std::meta::info> annotations_of( std::meta::info item ); |
(C++26 起) | |
返回一个 vector,其中包含应用于 item 所表示实体的标注的反射。
如果 item 表示函数 F 的形参 P,则设 S 为从求值上下文中的某一点可达的声明集合(忽略任何显式实例化),这些声明声明了 F 或者声明了 F 是它的特化的模板化函数,结果包含 S 中每个声明里应用于 P 的所有标注的反射。
如果 item 表示直接基类关系,则结果包含应用于相应基类说明符 的所有标注的反射。
对于返回的 vector 中的任意两个反射 R1 和 R2,如果 R1 所表示的标注先于 R2 所表示的标注,那么 R1 在 vector 中位于 R2 之前。如果 R1 和 R2 表示来自同一翻译单元 T 的标注,则返回的 vector 中位于 R1 和 R2 之间的任何元素都表示来自 T 的标注。除此之外的顺序是未指定的。
参数
返回值
一个 vector,包含应用于 item 所表示内容的标注的反射。
异常
除非 item 表示以下之一,否则抛出 std::meta::exception:
- 类型
- 类型别名
- 变量
- 函数
- 函数形参
- 命名空间
- 枚举项
- 直接基类关系
- 非静态数据成员
示例
#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):]); } }
输出: