C++中类似于Python getattr()函数的等效实现

8
在Python中,有一个名为getattr的函数,它看起来像这样:

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

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

在Python中,我们可以使用getattr函数来获取对象的属性值。例如,在以下代码中,调用getattr将返回4。

x = MyClass()
getattr(x, 'my_variable')  # returns 4

那么,在C++(非Visual C++)中有类似的方法吗?是否有任何库提供这种功能,使我可以使用字符串查找对象的成员变量?

我正在尝试查找C++类中的公共数据成员的方法,但是我无法更改该类。因此,我无法使用映射将字符串字面值映射到值。也许可以使用宏进行“反字符串化”?


请参见此处:https://dev59.com/gnVD5IYBdhLWcg3wQJKT - Andrew Lazarus
2
你可以写C/C++,并针对Python虚拟机工作,创建Python对象 :) (开玩笑!开玩笑!) - Not_a_Golfer
3个回答

15

您所询问的通常被称为内省

C++语言本身不支持内省。您可以模拟它,但这就是其范围。

在您提出的API中还有另一个问题:您如何构造方法的返回类型?一个boost::any类可用于存储该项,但是如果您不知道其类型,那么您将无法使用任何有用的内容。


是的,内省就是我要找的。至于类型,我不太担心,因为所有数据成员都是 int 或 double 值。谢谢! - ulu5

5

标准的C++中并没有像这样的存在。考虑一下结构体或类是如何工作的:

struct MyStruct {
  int a;
  int b;
};

假设一个int大小为32位,那么MyStructb位置总是比a位置多4个字节。这种偏移量运算由编译器提前处理。这就是为什么C语言访问成员数据非常快的原因:没有运行时查找!所以,如果我想在运行时查找"b",我必须找到它在结构体中的位置。为了做到这一点,编译器必须生成一个偏移表来存储在代码的某个地方。对于一个不应该有任何隐藏低效性的语言来说,这是很多额外的开销。

0

很遗憾,我不知道有这样的方法。这需要编译器的特殊支持,因为当前的编译器不存储任何所需的元数据,以进行此类反射。


嗯,除非你想使用调试符号。 :) - dschultz
同意,但我怀疑这将永远不会被实施。 - Johm Don

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接