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;
};

假设 anint的大小为 32 位,则MyStruct's的位置b始终与 的位置相距 4 个字节a。该偏移算术由编译器预先处理。这就是 C 访问成员数据如此之快的原因:没有运行时查找!

因此,如果我想"b"在运行时查找,我必须找到它在结构中的位置。为此,编译器必须生成一个偏移表以存储在代码中的某个位置。对于一种不会有任何隐藏的低效率的语言来说,这是一个很大的开销。

于 2012-05-01T16:37:34.543 回答
0

不幸的是,我不知道。这需要编译器的特殊支持,因为当前的编译器不存储这种反射所需的任何类型的元数据

于 2012-05-01T16:35:30.270 回答