◐ Shell
clean mode source ↗

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 中的任意两个反射 R1R2,如果 R1 所表示的标注先于 R2 所表示的标注,那么 R1vector 中位于 R2 之前。如果 R1R2 表示来自同一翻译单元 T 的标注,则返回的 vector 中位于 R1R2 之间的任何元素都表示来自 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):]);
    }
}

输出:

参阅