概要
C++向けの高速シリアライズライブラリ「Glaze」がバージョン7.2をリリースし、C++26のP2996リフレクション仕様への対応を正式に取り込んだ。P2996は2025年6月にC++26への採択が決定した標準コンパイル時リフレクション機能で、Glazeはこれを従来の__PRETTY_FUNCTION__解析や構造化バインディングに依存したハックの置き換えとして活用する。JSON、YAML、CBOR、MessagePack、TOMLなど幅広いフォーマットのシリアライズに対応するGlazeにとって、今回のアップデートはコンパイル時メタデータ取得の根本的な刷新となる。
P2996リフレクションで何が変わるか
最も大きな変化は、これまでシリアライズ不可能だった非集約型の自動処理が可能になった点だ。カスタムコンストラクタ・仮想関数・継承を持つクラスは、従来は手動でglz::metaによるメタデータ記述が必要だったが、P2996対応環境ではそれが不要になる。また、従来は構造化バインディングの制約から128メンバーが上限だったが、この制限も撤廃された。
さらに列挙型の自動文字列化にも対応した。これまではglz::metaの手書きが必要だったが、P2996環境ではreflect_enums = trueオプションを有効化することでColor::Greenが"Green"としてシリアライズされる(後方互換性維持のためデフォルトは従来通り整数値)。アクセス修飾子も無視できるため、privateメンバーを含む型も追加設定なしでリフレクション可能となった。内部実装ではstd::meta::nonstatic_data_members_ofとaccess_context::unchecked()を組み合わせて標準APIのみでメンバー情報を取得する。
| 特性 | 従来方式 | P2996対応 |
|---|---|---|
| 最大メンバー数 | 128 | 無制限 |
| 非集約型対応 | 手動記述が必要 | 自動 |
| 列挙型文字列化 | glz::meta必須 | 自動 |
| メンバー名取得 | __PRETTY_FUNCTION__解析 | 標準API |
対応コンパイラと有効化方法
現時点でP2996リフレクションを利用するには、GCC 16以降(-std=c++26 -freflection)またはBloomberg clang-p2996(-fexpansion-statements -stdlib=libc++)が必要となる。GCC 16はまもなく正式リリースが予定されている。CMakeではglaze_ENABLE_REFLECTION26オプションをONにするか、コンパイラに-DGLZ_REFLECTION26=1を渡すことで有効化できる。コンパイラが__cpp_lib_reflectionまたは__cpp_impl_reflectionマクロを定義している場合は自動で有効になる。
APIに破壊的変更はなく、既存のglz::metaによるカスタマイズも完全に維持される。ただし一点注意すべき変更として、型名の形式が変わった。従来は"mylib::MyEnum"のように修飾名が出力されていたが、P2996環境では"MyEnum"と非修飾名になる。自動生成されたキー名に依存するコードでは出力形式が変化する可能性があるため、移行時には確認が必要だ。
今後の展望
P2996対応はオプトイン形式であり、標準コンパイラによるビルドには影響しない。GCC 16の正式リリースとともに利用者が増えることが予想され、C++26リフレクションのエコシステム全体における実用的な先行事例となる。Glazeは今回の更新でYAMLの処理改善やストリームリクエストのバッファサイズ設定も取り込んでおり、シリアライズライブラリとしての対応範囲を引き続き拡充している。