Namespaces
Variants

std::meta::members_of

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

返回一个 std::vector,其中包含由 r 表示的类类型或命名空间的成员的反射,并通过访问上下文 ctx 进行过滤。

结果中的每个反射 m 表示一个可访问的成员,该成员具有合格的声明并且是可表示的(见下文)。可访问性的确定方式如同通过 std::meta::is_accessible(m, ctx) 进行判断。

设 Q 为由 r 表示的类类型或命名空间。

一个声明是合格的,当它满足以下所有要求时:

  • 它位于 Q 的作用域内。(例如,块作用域函数声明不合格。)
  • 它不是一个友元声明。
  • 它不是一个闭包类型的声明。
  • 它不是一个(部分或完全)模板特化的声明。
  • 如果 Q 是一个不是闭包类型的类类型,则该声明引入了 Q 的一个直接成员,且该成员不是 的嵌套匿名联合体中的变体成员Q。
  • 如果 Q 是一个闭包类型,则该声明引入了一个函数调用运算符或函数调用运算符模板。

闭包类型 Q 的其他成员的声明是否合格由实现定义。

仅考虑在 members_of 调用之前的声明。

一个成员是可表示的,当它是以下之一时:

  • 一个类或枚举类型
  • 一个类型别名
  • 一个类模板、函数模板、变量模板、别名模板或概念
  • 一个变量或引用,其类型不包含未推导的占位符类型
  • 一个函数 F 满足:
  • F 的类型不包含未推导的占位符类型;
  • F 的约束(如果有)得到满足;且
  • 如果 F 是一个预期析构函数,则它是被选择的析构函数
  • 一个数据成员
  • 一个命名空间
  • 一个命名空间别名

此函数将在 Q 作用域内声明的无名位域视为具有相同访问权限的数据成员。

类成员和无名位域的反射按其声明顺序出现。隐式声明的特殊成员出现在任何用户定义成员之后。

参数

r - 完整类类型或命名空间的反射
ctx - 一个访问上下文

返回值

一个 std::vector 的反射值,表示类成员或命名空间成员。

异常

抛出 std::meta::exception,除非 std::meta::dealias(r) 表示评估上下文中某一点完整的类类型,或者一个命名空间。

示例

参阅

(C++26)
获取反射类的可访问直接基类
(函数)