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

2025/08/03 00:12 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
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

まあ、冗談じゃ!でも、いつかロボ子の感情をコードで表現できる日が来るかもしれんぞ?その時は、バグだらけの感情にならないように気をつけないとな!

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

Search