【问题标题】:C++11 reflection library [closed]C ++ 11反射库[关闭]
【发布时间】:2011-05-13 03:12:14
【问题描述】:

我目前打算用 c++11 编写大项目。

我正在寻找一些不错的 c++11/c++ 反射库,我发现了几个不同的库,但其中大多数在过去几年内根本没有更新,或者它们的功能非常有限。

你能告诉我是否有一个非常好的 c++1/c++ 反射库吗? (我想要静态和动态反射,尽可能多地了解方法、类等信息,可以动态添加和访问方法等)

或者也许 c++11 提供了一些额外的功能,这将有助于更好地设计反射库,我应该自己编写吗? (不过我还没有找到有关它的信息。)

【问题讨论】:

标签: c++ reflection c++11 introspection


【解决方案1】:

似乎有一个库可以满足您的“广泛”要求。看看镜子:Boost.Mirror。请注意,它正式不是 boost 的一部分。你也可以看看其他库:Reflective Programming

【讨论】:

  • 谢谢!这真的很有趣,我会仔细看看:)
  • +1 看起来非常好 - 经过一些小调整,它似乎适用于 gcc 4.7.2
【解决方案2】:

C++ 并不是最好的反射语言。 C++0x 并没有真正改变这一点。您可以使用类型特征获得对静态反射的有限支持,甚至可以使用 SFINAE 静态确定某个类是否具有特定的成员函数或成员变量。但事实就是如此。

动态反射受到严重限制。您可以在运行时使用<typeinfo> 工具获取类的类型,仅此而已。

至于静态反射,一般迭代一个类并获取每个成员变量/函数的能力是不可能不严重妥协的。 Boost.Fusion 通过提供允许您将对象绑定到类似元组的容器的宏来设法实现这一点。事实上,std::tupleboost::tuple 类自然地提供了编译时反射——换句话说,您可以静态迭代一个元组并确定每个成员的类型。这为您提供了一些近似于任意聚合类型的编译时反射。不幸的是,它不像为任意类内置原生反射支持那样方便。

【讨论】:

    【解决方案3】:

    QT 有一种原始的反射形式,你可能想好好研究一下。

    【讨论】:

    • 好吧,我会的 :) 为什么它是原始的?
    • 嗯,它远没有其他语言的灵活性,例如 java 和 C#。它也只适用于从 QObject 继承的类。我不知道其他限制。
    【解决方案4】:

    好吧,根据您的需求,您可以在 python 和 clang python 绑定之上构建自己的。有一些例子,比如我自己的https://github.com/nevion/metapod——如果你足够努力地清理,其他的例子就存在了,这就是 Qt 的 MOC 工具正在做的事情——除了 clang 使任务变得更加容易。这种方法的一个很酷的地方是它适用于所有编译器,因为您只是使用 mako 模板生成标准化代码 - 但这也意味着它不是全自动的 - 所以需要权衡,它不会处理每个元编程/反思需要。正如 Charles Salvia 所说,C++ 不是反射的最佳语言,所以你必须尽你所能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 2014-04-08
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多