最終更新日時:
が更新

履歴 編集

function
<meta>

std::meta::has_identifier(C++26)

namespace std::meta {
  consteval bool has_identifier(info r);
}

概要

リフレクションが識別子を持つかどうかを判定する。

戻り値

rが表すものに応じて、以下のように判定する(先に一致した項目が適用される):

  • リンケージのためのtypedef名を持つエンティティを表す場合、true
  • 無名のエンティティを表す場合、false
  • 型エイリアスを表す場合、テンプレート実引数を持たなければ(!has_template_arguments(r)true
  • 型を表す場合、次のいずれかであればtrue、そうでなければfalse
    • CV修飾されていないクラス型であり、テンプレート実引数を持たない
    • CV修飾されていない列挙型である
  • 関数を表す場合、テンプレート実引数を持たず、かつコンストラクタ・デストラクタ・演算子関数・変換関数のいずれでもなければtrue、そうでなければfalse
  • テンプレートを表す場合、コンストラクタテンプレート・演算子関数テンプレート・変換関数テンプレートのいずれでもなければtrue、そうでなければfalse
  • 関数パラメータを表す場合、そのパラメータがパックから実体化されるものであればfalse。そうでなければ、到達可能なすべての宣言で同一の名前が付けられている場合にtrue、名前が付いていない、または宣言間で名前が一致しない場合はfalse

たとえば^^int^^voidのような基本型はクラス型でも列挙型でもないためfalse、列挙型Enumに対する^^Enumtrueとなる。

#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

処理系

参照