大多数成熟的C ++项目似乎都有自己的反射和属性系统,即用于定义可以通过字符串访问并可自动序列化的属性。我参与的至少很多C ++项目似乎重新发明轮子。
您是否知道任何支持反射和属性容器的良好的开源库,特别是:
答案 0 :(得分:11)
这是C ++遇到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。是的,它有许多其他人提到的限制。并且它不直接支持听众。
我研究的其他有希望的解决方案是
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