namespace std::meta {
consteval bool has_identifier(info r);
}
概要
リフレクションが識別子を持つかどうかを判定する。
戻り値
rが表すものに応じて、以下のように判定する(先に一致した項目が適用される):
- リンケージのためのtypedef名を持つエンティティを表す場合、
true - 無名のエンティティを表す場合、
false - 型エイリアスを表す場合、テンプレート実引数を持たなければ(
!has_template_arguments(r))true - 型を表す場合、次のいずれかであれば
true、そうでなければfalse: - 関数を表す場合、テンプレート実引数を持たず、かつコンストラクタ・デストラクタ・演算子関数・変換関数のいずれでもなければ
true、そうでなければfalse - テンプレートを表す場合、コンストラクタテンプレート・演算子関数テンプレート・変換関数テンプレートのいずれでもなければ
true、そうでなければfalse - 関数パラメータを表す場合、そのパラメータがパックから実体化されるものであれば
false。そうでなければ、到達可能なすべての宣言で同一の名前が付けられている場合にtrue、名前が付いていない、または宣言間で名前が一致しない場合はfalse
たとえば^^intや^^voidのような基本型はクラス型でも列挙型でもないためfalse、列挙型Enumに対する^^Enumはtrueとなる。
例
#include <meta>
void func(int x, int);
int main() {
static_assert(std::meta::has_identifier(
std::meta::parameters_of(^^func)[0])); // "x"という名前がある
static_assert(!std::meta::has_identifier(
std::meta::parameters_of(^^func)[1])); // 名前がない
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) ✅ - Visual C++: ??