7

Python には、次のような getattr という関数があります。

class MyObject():
    def __init__(self):
        self.xyz = 4

obj = MyObject()
getattr(obj, 'xyz')

getattr を呼び出すと 4 が返されます。

C++ (Visual C++ ではない) でこれを行う同様の方法はありますか?

文字列を使用してオブジェクトのメンバー変数を検索できるこの機能を備えたライブラリはありますか?

変更できない C++ クラスのパブリック データ メンバーを検索する方法を見つけようとしています。したがって、マップを使用して文字列リテラルを値にマップすることはできません。たぶん、マクロを使った「unstringify」のようなものでしょうか?

4

3 に答える 3

15

あなたが求めていることは、一般にIntrospectionと呼ばれます。

C++ 言語は、それ自体ではイントロスペクションをサポートしていません。あなたはそれをエミュレートすることができますが、それはその程度です.

あなたが提案するAPIには別の問題もあります.メソッドの戻り値の型をどのように定式化しますか? アイテムを格納するのに適したクラスがありますboost::any、とにかくそのタイプがわからない場合は、それを使用して何かを行うことはできません。

于 2012-05-01T16:35:05.607 に答える
5

このようなものは、標準 C++ には存在しません。構造体またはクラスが実際にどのように機能するかを考えてみましょう。

struct MyStruct {
  int a;
  int b;
};

intのサイズが 32 ビットであると仮定すると、の位置は常にMyStructb位置から 4 バイト離れていますa。そのオフセット演算は、コンパイラによって事前に処理されます。これが、C がメンバ データへのアクセスに非常に高速である理由です。ランタイム ルックアップはありません。

したがって"b"、実行時に検索したい場合は、それが構造体のどこにあるかを見つける必要があります。そのためには、コンパイラはオフセット テーブルを生成してコードのどこかに格納する必要があります。これは、隠れた非効率性を持たないように意図された言語にとっては、多くのオーバーヘッドです。

于 2012-05-01T16:37:34.543 に答える
0

残念ながら、私が知っているものはありません。現在のコンパイラは、この種のリフレクションに必要なメタデータを保存していないため、これにはコンパイラからの特別なサポートが必要です。

于 2012-05-01T16:35:30.270 に答える