1

重複の可能性:
C ++アプリケーションにリフレクションを追加するにはどうすればよいですか?

Pythonの場合と同様に、オブジェクトのすべての属性/関数/メンバーを一覧表示するdir()がありますが、C ++オブジェクトがgdbまたはその他のユーティリティですべてのメンバーを取得する方法はありますか?

4

1 に答える 1

2

C++ には、これを実現するための組み込みメカニズムが用意されていません。このトピックは、Keith Randall が指摘した議論で十分にカバーされているようです。

gdbはオブジェクトのデータ メンバーを提供できますが、参照するオブジェクトのインスタンスが必要でありprint a、グローバルの名前が である場合はを実行しaます。メソッドを見つけるにはinfo functions A::*、クラス名が の場合は を使用しますA。これはインライン関数を検出しません (baz_inline例のメモ)。

class A {
public:
    void foo ();
    int bar (int);
    void baz_inline () {}
    double d;
    short p;
};
A a;
void A::foo () {}
int A::bar (int) { return 0; }
int main () {}

$ g++ -g c.cc
$ gdb a.out
(gdb) p a
$1 = {d = 0, p = 0}
(gdb) p &a.d
$2 = (double *) 0x600920
(gdb) p &a.p
$3 = (short *) 0x600928
(gdb) info functions A::*
All functions matching regular expression "A::*":

File c.cc:
int A::bar(int);
void A::foo();
(gdb) quit

元々、ミドルウェアを考えていたのは、部分的にやりたいことをするミドルウェア技術があるからです。そこでは、C++ クラスがメタ言語 (IDL - インターフェイス定義言語) で定義され、ミドルウェア ツールがクラスの IDL 記述を解析して C++ クラス定義を生成します。この目的の 1 つは、そのタイプのオブジェクトをパッケージ化し、別のマシンに配信し、そのマシンでアンパックし、そのマシン上のソフトウェアがオブジェクトを使用できるようにする方法を理解するコードを生成できるようにすることでした。

そのようなニーズについては説明していませんが、C++ インターフェイスとそのデータ メンバーについて知りたいという点で、同様の機能が必要です。Python には既にこの機能があるとおっしゃっていたので、Python コードを IDL として使用する独自の小さなツールを簡単に作成できるのではないかと考えていました。つまり、実際に C++ オブジェクトにしたい python オブジェクトを作成し、ツールはその結果を取得dir()して、そのオブジェクトを表す C++ ヘッダー ファイルを生成します。C++ オブジェクトについて知りたい情報については、Python バージョンのオブジェクト (Python が埋め込まれている) にクエリを実行できます。

于 2012-06-09T05:27:47.297 に答える