std::meta::annotations_of
来自cppreference.com
| 在标头 <meta> 定义
|
||
| |
(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 的标注。除此之外的顺序是未指定的。
参数
| item | - | 一个反射值 |
返回值
一个 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):]);
}
}
输出:
3.14
42
参阅
(C++26) |
获取应用于所反射实体且具有指定类型的标注 (函数) |
(C++26) |
检查反射是否表示标注 (函数) |
(C++26) |
获取所反射实体的常量值的反射 (函数) |
(C++26) |
获取所反射实体的类型的反射 (函数) |