C++ で完全なオブジェクト/クラス リフレクション システムを構築するためのリファレンスはありますか?
私はクレイジーなマクロ/テンプレートソリューションを見てきましたが、すべてを快適なレベルで解決するシステムを見つけたことはありません.
ありがとう!
C++ で完全なオブジェクト/クラス リフレクション システムを構築するためのリファレンスはありますか?
私はクレイジーなマクロ/テンプレートソリューションを見てきましたが、すべてを快適なレベルで解決するシステムを見つけたことはありません.
ありがとう!
テンプレートとマクロを使用して自動的または半自動的にすべてを定義することは、C++ ではほとんど唯一のオプションです。C++ のリフレクション/イントロスペクション機能は非常に弱いです。ただし、主にシリアライゼーションとストレージが必要な場合は、 Boost Serialization librariesで既に実装されています。これを行うには、クラスにシリアライザー メソッドを実装するか、クラスを変更したくない場合は外部関数を使用します。
これはあなたが求めていたものではないようです。クラス実装者の側で余分な労力を必要としない自動シリアル化のようなものが必要だと思います。これはPython、Java、および他の多くの言語で使用できますが、C++ では使用できません。必要なものを取得するには、IgKh が回答で言及したメタオブジェクト システムなど、独自のオブジェクト システムを実装する必要があります。
そうしたい場合は、JavaScript がオブジェクトを実装する方法を調べることをお勧めします。JavaScript はプロトタイプ ベースのオブジェクト システムを使用します。これはかなりシンプルですが、かなり強力です。自分でやった方が実装しやすいと思うので、これをお勧めします。プロトタイプの利点と優雅さに関する非常に長い説明を読みたい場合は、Steve Yegge のブログでこのテーマに関するエッセイを見つけることができます。彼は非常に経験豊富なプログラマーなので、彼の意見にはある程度の信憑性がありますが、自分でこれを行ったことがないので、他の人が言ったことを指摘することしかできません。
あまりなじみのないプロトタイプではなく、より C++ スタイルのクラスとインスタンスを使用したい場合は、Pythonオブジェクトとシリアライゼーションがどのように機能するかを見てください。Python もオブジェクトの実装に「プロパティ」アプローチを使用しますが、プロパティはプロトタイプ ベースのシステムではなく、クラスと継承の実装に使用されるため、もう少しなじみがあるかもしれません。
申し訳ありませんが、私はあなたの質問に対するより簡単な答えを持っていません! しかし、うまくいけば、これは役に立ちます。
私はあなたの意図を完全には理解していませんが、Qt フレームワークには、システムのリフレクションから期待されるほとんどの操作を実行できる強力なメタ オブジェクト システムが含まれています: クラス名を文字列として取得し、オブジェクトがインスタンスであるかどうかを確認します。特定のタイプ、リストおよび呼び出しメソッドなど。
私はROOT の Reflexライブラリを使用して良好な結果を得ました。説明したようなクレイジーなマクロ/テンプレート ソリューションを使用するのではなく、ビルド時に C++ ヘッダー ファイルを処理してリフレクション ディクショナリを作成し、それらを操作します。