std::meta::has_identifier
来自cppreference.com
| 在标头 <meta> 定义
|
||
| |
(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。
示例
| 本节未完成 原因:暂无示例 |
参阅
(C++26) |
将 meta::operators 枚举项转换为其符号名 (函数) |
(C++26) |
若所反射实体具有标识符,则获取其名字 (函数) |
| 获取适于标识所反射实体的字符串 (函数) |