C ++相当于Python的getattr

时间:2012-05-01 16:30:29

标签: c++ python serialization boost getattr

在python中,有一个名为getattr的函数,如下所示:

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

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

对getattr的调用将返回4.

在C ++(非Visual C ++)中是否有类似的方法?

是否有任何具有此功能的库我可以使用字符串查找对象的成员变量?

我试图找到一种在C ++类中查找公共数据成员的方法,我无法更改。所以我不能使用地图将字符串文字映射到值。也许就像用宏观'unstringify'一样?

3 个答案:

答案 0 :(得分:11)

您所要求的通常被称为 Introspection

C ++语言本身不支持内省。你可以模仿它,但这就是它的范围。

您建议的API中还有另一个问题:您将如何制定方法的返回类型?那里的一个适合存储项目的boost::any类,但是如果你不知道它的类型,你将无法使用它。

答案 1 :(得分:4)

标准C ++中不存在这样的情况。考虑结构或类实际如何工作:

struct MyStruct {
  int a;
  int b;
};

假设int的大小为32位,则MyStruct的{​​{1}}的位置始终距离b的位置为4个字节。 偏移算法由编译器预先处理。这就是为什么C访问成员数据的速度如此之快:没有运行时查找!

因此,如果我想在运行时查找a,我必须找到结构中的位置。要做到这一点,编译器必须生成一个偏移表来存储在代码中的某个地方。对于一种意味着没有任何隐藏的低效率的语言来说,这是一个很大的开销。

答案 2 :(得分:0)

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