C ++ 11反射库

时间:2010-11-20 16:27:15

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

我现在要用c ++ 11编写大项目。

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

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

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

4 个答案:

答案 0 :(得分:9)

C ++并不是反射的最佳语言。 C ++ 0x并没有真正改变它。您可以使用类型特征获得对静态反射的有限支持,甚至可以使用SFINAE静态地确定某个类是否具有特定成员函数或成员变量。但那才是真的。

动态反射受到严重限制。您可以使用<typeinfo>工具在运行时获取类的类型,但这就是它。

对于静态反射,如果没有严重的妥协,就不可能在类上进行一般迭代并获得每个成员变量/函数。 Boost.Fusion设法通过提供允许您将对象绑定到类似元组的容器的宏来实现此目的。事实上,std::tupleboost::tuple类自然提供编译时反射 - 换句话说,您可以静态迭代元组并确定每个成员的类型。这为您提供了一些近似于任意聚合类型的编译时反射的东西。不幸的是,它不像为任意类内置了本机反射支持那么方便。

答案 1 :(得分:5)

似乎有一个图书馆可以满足您的“广泛”要求。看一下Mirror:Boost.Mirror。请注意,它正式不是提升的一部分。您还可以查看其他库:Reflective Programming

答案 2 :(得分:3)

QT有一种原始形式的反射,你可能想要抓住它。

答案 3 :(得分:3)

根据您所追求的内容,您可以构建自己的python和clang python绑定。有一些例子,例如我自己的https://github.com/nevion/metapod - 如果你足够难以清除并且在某种程度上这就是Qt的MOC工具正在进行的其他例子 - 除了clang使任务变得如此简单。关于这种方法的一个很酷的事情是它适用于所有编译器,因为你只是使用mako模板生成标准化代码 - 但这也意味着它不是完​​全自动的 - 所以有一个权衡,它不会处理每个元编程/反思需要。正如Charles Salvia所说,C ++并不是最好的反思语言,因此你必须采取你能得到的东西。