C++ equivalent of Python getattr

C++ equivalent of Python getattr

本文关键字:getattr Python of equivalent C++      更新时间:2023-10-16

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

class MyObject():
    def __init__(self):
        self.xyz = 4
obj = MyObject()
getattr(obj, 'xyz')

其中对 getattr 的调用将返回 4。

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

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

正在尝试找到一种方法来查找我无法更改的C++类中的公共数据成员。所以我不能使用映射将字符串文字映射到值。也许就像用宏"取消字符串化"一样?

你所要求的通常被称为内省

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

您提出的 API 中还有另一个问题:您将如何制定方法的返回类型?有一个适合存储该项目的boost::any类,但是如果您不知道它的类型,您将无法使用它进行任何有用的操作。

标准C++中不存在这样的东西。考虑结构或类的实际工作原理:

struct MyStruct {
  int a;
  int b;
};

假设一个int的大小为 32 位,那么MyStruct b的位置总是与 a 的位置相距 4 个字节。该偏移算术由编译器预先处理。这就是为什么 C 访问成员数据的速度如此之快:没有运行时查找!

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

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