std::meta::has_identifier

来自cppreference.com
< cpp | meta
在标头 <meta> 定义
consteval bool has_identifier( std::meta::info r );
(C++26 起)

判断 r 所表示的内容是否具有关联的标识符(包括字面量后缀标识符)。

形式上:

  • 如果 r 表示具有以链接为目的的 typedef 名的实体,则返回 true
  • 否则,如果 r 表示无名的类、枚举、变量、位域或命名空间,则返回 false
  • 否则,如果 r 表示类型别名,则返回 !std::meta::has_template_arguments(r)
  • 否则,如果 r 表示类型,则返回 true 的条件为:
  • r 表示不带 cv 限定的类类型且 std::meta::has_template_arguments(r)false,或者
  • r 表示不带 cv 限定的枚举类型。
  • 否则,如果 r 表示函数,则当 std::meta::has_template_arguments(r)false,且该函数不是构造函数、析构函数、运算符函数或转换函数时,返回 true
  • 否则,如果 r 表示模板,则当该模板不是构造函数模板、运算符函数模板或转换函数模板时,返回 true
  • 否则,如果 r 表示函数形参,且该形参所属的函数是从函数模板实例化的,并且该形参是函数形参包中的元素,则返回 false
  • 否则,如果 r 表示函数 F 的形参 P,则设 S 为从求值上下文中的某一点可达的声明集合(忽略任何显式实例化),这些声明声明了 F 或者声明了 F 是它的特化的模板化函数;如果满足以下条件则返回 true
  • S 中存在一个声明 D,它为 P 或与 D 所声明的模板化函数中对应于 P 的形参引入了名称 N,并且
  • S 中没有声明使用除 N 以外的任何名称来达到同样目的。
void fun(int);
constexpr std::meta::info r = parameters_of(^^fun)[0];
static_assert(!has_identifier(r));

void fun(int x);
static_assert(has_identifier(r));

void fun(int x);
static_assert(has_identifier(r));

void poison() {
    void fun(int y);
}
static_assert(!has_identifier(r));
  • 否则,如果 r 表示变量,则当该变量对应于函数形参包中的元素,或 std::meta::has_template_arguments(r)true 时返回 false,否则返回 true
  • 否则,如果 r 表示结构化绑定,则当该结构化绑定是结构化绑定包中的元素时返回 false,否则返回 true
  • 否则,如果 r 表示枚举项、非静态数据成员、命名空间或命名空间别名,则返回 true
  • 否则,如果 r 表示直接基类关系,则返回 std::meta::has_identifier(std::meta::type_of(r))
  • 否则,如果 r 表示数据成员描述 (T, N, A, W, NUA, ANN),则当该描述的名称 N 不是 ⊥ 时返回 true
  • 否则,返回 false

参数

r - 一个反射值

返回值

如果 r 所表示的内容具有标识符,则为 true,否则为 false

示例

参阅

meta::operators 枚举项转换为其符号名
(函数) [编辑]
若所反射实体具有标识符,则获取其名字
(函数) [编辑]
获取适于标识所反射实体的字符串
(函数) [编辑]