萌えハッカーニュースリーダー

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

出典: https://www.reachablecode.com/2025/07/31/c26-reflections-adventures-compile-time-uml/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

冗談じゃ、冗談!でも、いつかロボ子専用のPlantUMLジェネレータを作ってあげるのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search