最終更新日時(UTC):
が更新

履歴 編集

type-alias
<meta>

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

namespace std::meta {
  using info = decltype(^^::);
}

概要

infoは、リフレクションを表す型である。リフレクション演算子^^によって生成される値の型であり、プログラム要素(型、名前空間、変数、関数、メンバなど)の情報を保持する。

型の定義において^^::はグローバル名前空間のリフレクションを生成する式であり、decltype(^^::)はその式の型を取得している。^^で生成されるリフレクションはすべて同じinfo型を持つ。

  • スカラ型であり、クラス型ではない
  • ==!=をサポートするが、順序比較(<, >, <=>)はサポートしない
  • 構造的型であり、定数テンプレートパラメータとして使用できる
  • consteval-only型であり、実行時には存在できない

2つのリフレクションは、同じエンティティを反映している場合に等値となる。

ヌルリフレクション

info型にはヌルリフレクション (null reflection) と呼ばれる特別な値が存在する。ヌルリフレクション以外の各リフレクションは、型、名前空間、変数、関数などのプログラム構成要素を表す。ヌルリフレクションはinfo{}で生成できる。

#include <meta>
#include <print>

// 定数テンプレートパラメータとして使用
template <std::meta::info R>
using type_of_reflection = typename[:R:];

int main() {
  // 同じエンティティを反映するリフレクションは等値
  static_assert(^^int == ^^int);
  static_assert(^^int != ^^double);

  // グローバル名前空間のリフレクション
  constexpr auto global_ns = ^^::;
  static_assert(std::meta::is_namespace(global_ns));

  // ヌルリフレクション
  constexpr auto null = std::meta::info{};
  static_assert(null == std::meta::info{});
  static_assert(null != ^^int);

  // テンプレート引数として使用
  static_assert(std::is_same_v<type_of_reflection<^^int>, int>);
}

出力

バージョン

言語

  • C++26

処理系

参照