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
処理系
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) ✅ - Visual C++: ??