属性& C ++的反射库?

时间:2008-09-17 21:36:59

标签: c++ reflection attributes

大多数成熟的C ++项目似乎都有自己的反射和属性系统,即用于定义可以通过字符串访问并可自动序列化的属性。我参与的至少很多C ++项目似乎重新发明轮子

您是否知道任何支持反射和属性容器的良好的开源库,特别是:

  • 通过宏定义RTTI和属性
  • 通过代码访问RTTI和属性
  • 属性的自动序列化
  • 聆听属性修改(例如OnValueChanged)

8 个答案:

答案 0 :(得分:11)

这是C ++遇到Reflection时所得到的:

C++ meets Reflection

无论你选择什么,它都可能有可怕的宏,难以调试代码或奇怪的构建步骤。我见过一个系统自动从DevStudio的PDB文件中生成序列化代码。

严重的是,对于小型项目,编写保存/加载功能(或使用流式运算符)会更容易。实际上,这也可能适用于大型项目 - 显而易见的是,如果结构发生变化,您通常需要更改代码。

答案 1 :(得分:11)

有一个新项目使用完全不同的方法在C ++中提供反射: CAMP https://github.com/tegesoft/camp

CAMP不使用预编译器,类/ properties / functions / ...是使用类似于boost.python或luabind的语法手动声明的。当然,人们可以使用像gccxml或open-c ++这样的预编译器来生成这个声明,如果他们愿意的话。

它仅基于纯C ++和boost头,并且由于模板元编程的强大功能,它支持任何类型的可绑定实体(例如,继承和奇怪的构造函数不是问题)。

它是根据MIT许可证(以前的LGPL)分发的。

答案 2 :(得分:5)

您可以查看下面的两个工具。我从来没有使用过它们,所以我不能告诉你它们是如何实用的。

<强> XRTTI

  

Xrtti是一个工具和附带的C ++库,它扩展了C ++的标准运行时类型系统,以提供更丰富的关于类和方法的反射信息集来操作这些类及其成员。

<强> OpenC++

  

OpenC ++是C ++前端库(词法分析器+解析器+ DOM / MOP)和源到源转换器。 OpenC ++支持开发C ++语言工具,扩展,特定于域的编译器优化和运行时元对象协议。

答案 3 :(得分:4)

我看了这些东西很长一段时间,但他们往往非常沉重。它们可能会阻止你使用继承,或者使用奇怪的构造函数等等。最后它们最终会成为过多的负担而不是方便。

这种用于公开我现在使用的成员的方法非常轻量级,并允许您浏览一个类进行序列化或将所有名为“x”的字段设置为0。它也是静态确定的,因此速度非常快。没有图书馆代码或代码层可以担心搞乱构建过程。它概括为嵌套类型的层次结构。

使用一些宏设置编辑器以自动编写其中一些内容。

struct point
{
     int x;
     int y;

     // add this to your classes
     template <typename Visitor>
     void visit(Visitor v)
     {
         v->visit(x, "x"); 
         v->visit(y, "y");
     }
};


/** Outputs any type to standard output in key=value format */
struct stdout_visitor
{
     template <typename T>
     void visit(const T& rhs)
     {
         rhs.visit(this);
     }

     template <typename Scalar>
     void visit (const Scalar& s, const char* name)
     {
          std::cout << name << " = " << s << " ";
     }
}

答案 4 :(得分:3)

也看了一会儿。目前最简单的解决方案似乎是BOOST_FUSION_ADAPT_STRUCT。实际上,一旦你有了一个库/头文件,你只需要将你的struct字段添加到BOOST_FUSION_ADAPT_STRUCT()宏中,作为the last segment of the code shows。是的,它有许多其他人提到的限制。并且它不直接支持听众。

我研究的其他有希望的解决方案是

  • CAMP和XRTTI / gccxml,但似乎都是将外部工具依赖项纳入项目的障碍。
  • 多年前,我使用perl c2ph / pstruct来转储gcc -gstabs输出中的元信息,这种信息不那么具有干扰性,但需要更多工作,尽管它对我来说非常合适。

关于boost / __ cxa方法,一旦弄清楚所有小细节,添加/更改结构或字段很容易维护。我们目前使用它在dbus之上构建自定义类型绑定层,以序列化API并隐藏托管对象服务子系统的传输/ RPC详细信息。

答案 5 :(得分:2)

不是一般的,但QT通过元编译器支持,并且是GPL。 通过与QT人交谈,我的理解是纯C ++不可能实现,因此需要moc。

答案 6 :(得分:2)

这通常是C ++语言的一个臭名昭着的弱点,因为需要标准化以使反射实现可移植且值得的东西不是标准的。我想到了调用约定,对象布局和符号错位,但也有其他一些。

标准缺乏方向意味着编译器实现者会做一些不同的事情,这意味着很少有人有动力编写便携式反射库,这意味着需要反射的人重新发明轮子,但只是足够他们需要的东西。这种情况发生在 ad infinitum ,我们就是这样。

答案 7 :(得分:0)

自动内省/反射工具包。使用像Qt&s这样的元编译器,并将元信息直接添加到目标文件中。直观易用。没有外部依赖。甚至允许自动反映std :: string,然后在脚本中使用它。请访问IDK