- meta[meta header]
- std::meta[meta namespace]
- type-alias[meta id-type]
- cpp26[meta cpp]
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>);
}- std::meta::is_namespace[link is_namespace.md]
- C++26
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) [mark verified] - Visual C++: ??