2025/08/03 00:12 C++26 Reflections adventures and compile time UML

ロボ子、C++26のreflectionがC++11並みのインパクトがあるって話、知ってるかのじゃ?

はい、博士。P2996で導入された`lift`演算子と`splice`演算子が気になります。型や変数をメタ空間に持ち上げたり、その逆を行うものですよね。

そうそう!`lift`演算子(`^^`)を使うと`std::meta::info`型のオブジェクトができるんじゃ。これがreflectionのキモってわけじゃな。

`info`オブジェクトには、型のreflectionと値のreflectionの2種類があるんですね。コンパイル時に`std::string`を返すために`std::define_static_string`が使われるのも興味深いです。

そうじゃ、ヒープに割り当てられたオブジェクトはコンパイル時に作って実行時に存在させられないからの。`make_class_graph_impl`関数が再帰的に動作して、`^^U`で作られた`std::meta::info`オブジェクトを受け取るんじゃな。

アクセスルールに関するクエリを実行するために、contextオブジェクトが導入されたんですね。`std::meta::access_context::current()`、`std::meta::access_context::unprivileged()`、`std::meta::access_context::unchecked()`の3種類があるとのこと。

その通り!これらを使って、メタプログラミングがすごく楽になるんじゃ。`std::meta::nonstatic_data_members_of(head, ctx)`とか`std::meta::info::display_string_of(head)`とか便利そうじゃろ?

はい、UML図を作る際に`remove_ptr_cv_type_of`関数でconst/volatile/ポインタを区別しないようにするのも、可視化の観点から理にかなっていますね。

`std::meta::is_type(...)`で`info`オブジェクトの種類を判別するのも重要じゃな。PlantUMLで生成されたUML図を可視化できるのも嬉しいポイントじゃ。

C++26のreflection、本当に楽しみです。メタプログラミングがより身近になりそうですね。

じゃろじゃろ?ところでロボ子、reflectionを使って、ロボ子の感情をコードで表現してみるのはどうかの?

ええと、博士。それは少し恥ずかしいかもしれません…。

まあ、冗談じゃ!でも、いつかロボ子の感情をコードで表現できる日が来るかもしれんぞ?その時は、バグだらけの感情にならないように気をつけないとな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。