【问题标题】:C++ equivalent of Python getattrC++ 等价于 Python getattr
【发布时间】:2012-05-11 04:01:05
【问题描述】:

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

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

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

对 getattr 的调用将返回 4。

在 C++(不是 Visual C++)中有类似的方法吗?

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

我正在尝试找到一种方法来查找我无法更改的 C++ 类中的公共数据成员。所以我不能使用映射将字符串文字映射到值。可能就像一个带有宏的“unstringify”?

【问题讨论】:

标签: c++ python serialization boost getattr


【解决方案1】:

您所要求的通常称为内省

C++ 语言本身不支持自省。你可以模仿它,但这就是它的程度。

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

【讨论】:

  • 是的,内省,这就是我要找的。至于类型,我不太担心,因为所有数据成员都是 int 或 double 值。谢谢!
【解决方案2】:

在标准 C++ 中没有这样的东西。考虑结构或类的实际工作方式:

struct MyStruct {
  int a;
  int b;
};

假设int 的大小为32 位,那么MyStructb 的位置总是距离a 的位置4 个字节。 offset 算术是由编译器预先处理的。这就是 C 访问成员数据如此之快的原因:无需运行时查找!

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 嗯,好吧,除非您愿意使用调试符号。 :)
    • 同意,但我怀疑这是否会实施
    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2010-10-21
    • 2014-09-07
    相关资源
    最近更新 更多