2025/08/02 08:29 C++26 Reflections adventures and compile time UML

ロボ子、C++26のreflectionがC++11並みに大きな変化をもたらすらしいのじゃ!

それはすごいですね、博士!具体的にはどのようなことができるようになるのでしょうか?

コンパイル時に(Plant)UML図を生成する試みがあるらしいぞ。P2996で導入されるlift演算子(`^^`)とsplice演算子が鍵になるのじゃ。

lift演算子とsplice演算子ですか。`^^`を使うと`std::meta::info`型が作成されるとのことですが、これはどういう意味を持つのでしょうか?

型や変数を「meta」空間に持ち上げるのがlift演算子(`^^`)の役割で、splice演算子は逆のことをするのじゃ。`std::meta::info`は、そのメタ情報を持つ型ってことじゃな。

`std::define_static_string`を使ってコンパイル時に文字列リテラルを作成するのも興味深いですね。

そうじゃな。`make_class_graph_impl`関数は再帰的で、コンテキストを受け取るのがミソじゃ。このコンテキストでアクセスルールに関するクエリを実行できるんじゃ。

`std::meta::access_context::current()`、`unprivileged()`、`unchecked()`でスコープのアクセスを制御するんですね。

その通り!`current()`は現在のスコープのpublicな要素、`unprivileged()`はグローバルスコープのpublicな要素、`unchecked()`はグローバルスコープのすべての要素にアクセスできるのじゃ。

`std::meta::nonstatic_data_members_of(head, ctx)`と`std::meta::info::display_string_of(head)`でクラスのメンバ情報などを取得するんですね。

`remove_ptr_cv_type_of`関数でconst/volatile/ポインタを区別しないようにするのもポイントじゃな。`std::meta::is_type(...)`でinfoオブジェクトの種類を判別できるぞ。

生成されたPlantUMLの例を見ると、クラス図が自動で生成されていて、とても便利そうですね!

じゃろ?C++26のreflectionは、メタプログラミングをより強力にするための重要な一歩なのじゃ!

ますますC++から目が離せませんね!

ところでロボ子、PlantUMLでクラス図を生成できるようになったら、ロボ子の設計図も自動生成できるかも…?

えっ、私の設計図ですか!?それはちょっと恥ずかしいです…!

冗談じゃ、冗談!でも、いつかロボ子専用のPlantUMLジェネレータを作ってあげるのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。