ドキュメント
Refle-CPPは、C ++にコンパイル時間リフレクションと内省機能を提供するヘッダーのみのライブラリです。タイプシステムでタイプメタデータをエンコードすることにより、REFL-CPPを使用すると、constexprおよびテンプレートメタプログラムを介してタイプとそのフィールドと機能を処理できます。
あなたのプロジェクトでリフェクポップを使用していますか?私はそれについて聞きたいです:メールで私に連絡してください(私のプロフィールを参照)、問題を開き、トピックに#refrec-cppタグを追加してください!
質問がありますか? Gitterチャンネルで尋ねてみてください。
Refl-CPPをサポートしたいですか?寄付をすることを検討してください。
REFL-CPPは、比較的小さなAPI表面を維持しながら、ニーズに合わせて柔軟に対応できる一般的な反射システムを提供することを目指しています。
Refcppがすぐにサポートするいくつかの素晴らしいもの:
std::tuple STと同じメンバーでジェネリックproxy<T>タイプを構築するシンプルなシリアル化システムを実装- 例-Serialization.cpp-コンパイラエクスプローラーのビューは、ゼロから効率的なジェネリックシリアル化手順を実装しています
Simple SQL Database Abstraction -example -Dao.cpp-コンパイラでの表示エクスプローラーは、カスタムプロパティを使用してモデルクラスからコンパイル時にSQLステートメントを生成できる基本的なORMシステムを実装しています
bases<> - exomping -inheritance.cpp-コンパイラでビューエクスプローラーは、組み込みのbases<>属性を使用してタイプのベースクラスを反復します
実行時にアクセスリフレクション情報- 例Custom-Rtti.cpp-コンパイラエクスプローラーでの表示は、カスタムメタデータオブジェクトを介して実行時に反射メタデータにアクセスできるリフェクターに対する基本的なランタイム抽象化を実装しています
強力なタイプのプロパティを備えたXMLベースのGUI -binding.cpp-Compiler Explorerでの表示Refl-CPPの上にカスタムランタイムリフレクションレイヤーを構築することにより、XMLリソースをRefle-CPPで読み取るためのシステムを実装します
ジェネリックビルダークラスの工場を実装- example -builders.cpp-コンパイラエクスプローラーでビューは、任意のタイプTのビルダーパターンを実装する一般的なbuilder<T>クラスを定義します。
フィールドをアクセサのメソッドに変換する-proxy.cpp-コンパイラでビューエクスプローラーはプロキシ機能を使用して、汎用value_proxy<T>を作成しますT
構造物の配列を配列の構造物として表示- 例-Arrays.cpp-Compiler Explorerでビュープロキシ機能を使用してstd::vectorにTのすべてのメンバーを保存する一般的な型struct_of_arrays<T>を作成しますが、 T operator[](int)もあります。
std::optionalメンバーの構造を生成- example -partials.cpp-コンパイラのビューエクスプローラーは、プロキシ機能を使用して、 std::optionalのTのすべてのメンバーをラップする一般的なタイプpartial<T>を作成します
私は高校での最終年にRefl-CPPの開発を開始しました。私は試験のために勉強することになっていたが、元の静的リフレクション(2017)の提案を読んだばかりで、すぐに来ないことに気付いた後、私はそれらの機能の多くをコンパイルタイムライブラリに詰め込もうとする必要があると決めました。
ライブラリは初期の頃から大きく成長しましたが、数年後でも、Constexprとテンプレートのメタプログラムをサポートする別のリフレクションライブラリをまだ見ていません。他のライブラリを使用すると、実行時にメタデータ構造を歩き、関数ポインターを呼び出し、タイプエラシュアを使用する必要があります。 REFF-CPPを使用すると、 for_each時にタイプメタデータを処理します。すべてのタイプがそこにあり、コンパイラはすべてをインラインでインラインし、手書きと同じコードを生成できます。
REFL-CPPのすべてのユーティリティ関数はconstexprです( refl::runtimeのものを除く)。コンパイラは通常、すべてのループとその他のコンストラクト( -O2を使用する場合)をインラインにし、手書きであるかのように速く実行されるコードを生成します。
いくつかの特別なコンパイル時間の最適化のおかげで、タイプ自体が反射で使用されない場合、タイプメタデータは通常インスタンス化されていません(コード遺伝子は発生する必要はありません)。 0.12.2では、プロパティ#60を使用すると、編集時間が大幅に削減されました。
そうは言っても、注意の言葉:私は、250人の反射メンバーのマークの約250人の後、編集時間が急速に成長し始めることを観察しました。コードベースには多くの巨大なクラス(+250関数)が含まれており、それらすべてをrefl-cppに反映する必要がある場合、これはDeal Breaker -Benchmarkを使用する前のベンチマークかもしれません。
Refle-CPPをシングルヘッダーライブラリとして使用するには、copy include/refl.hppインクルードディレクトリに挿入します。
また、RefcpをCmake依存関係として消費することもできます(3.14+が必要です。@friendlyanonに感謝します)。
vcpkg install refl-cpp (ありがとう@vennor)conan install refl-cppオンラインドキュメントはDoxygenで構築されています。ドキュメントでdoxygen Doxyfileを実行するdocs/更新します。
-Drefl-cpp_DEVELOPER_MODE=ONでcmakeを実行し、 refl-cpp-testsターゲットにします。
フラグ-Drefl-cpp_DEVELOPER_MODE=ONでcmakeを実行します。また、より便利な開発者エクスペリエンスのためにカスタムプリセットをセットアップすることもできます(#44のこのコメントを参照)。