题
最成熟C++项目似乎有一个自己 反射系统和属性, 我.e用于限定的属性,它可能访问的串和自动序列化。至少有许多C++项目中,我参加了在看来 重新发明轮子.
你知不知道任何 良好的开放源图书馆 C++其支持的反思和属性的容器,特别是:
- 定义RTTI和属性,通过宏
- 访问RTTI和属性通过代码
- 自动电子监管的属性
- 听属性的修改(例如OnValueChanged)
其他提示
这是你得到的是什么当C++符合反思:
无论你选择什么,它可能会有可怕的宏难以调试代码或怪异建立的步骤。我见过一个系统自动生成的电子监管码从DevStudio的PDB文件。
虽然严重,对于小的项目,这将更易于编写保存/装载功能(或使用流运营商).事实上,这可能拥有的大型项目,也很明显什么和你通常需要改变码无论如何,如果该结构的变化。
有一个新的项目提供反映在C++使用一个完全不同的方法: 营地. https://github.com/tegesoft/camp
营地不使用预编译器,该类别/性能/职能/...被宣布为手动使用的语法相类似的提升。蟒蛇或luabind.当然,人们可以使用一个预编译器喜欢gccxml或开c++产生这一宣言如果他们更喜欢。
这是基于纯粹C++和提高头,并由于电力的模板元编程,它支持任何种类的可绑定的实体(继承和奇怪的构造是不是一个问题,例如)。
它分布在麻省理工学院许可证(原先的LGPL).
我看着这些东西相当长的一段时间,但他们往往是非常沉重。他们可能会阻止你从使用遗产继承,或有奇怪的构造等等。在结束他们被太多的负担而不是便利。
这种方法用于暴露的成员,我现在使用是相当轻并允许你探索一个类化或设置的所有领域称为"x"为0,例如。这也是静态确定所以是非常非常快。没有层的图书馆的代码或代码代用担心惹的建立过程。它generalises到的层次结构的嵌套的类型。
设置你的编辑的一些宏自动化编写的一些东西。
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 << " ";
}
}
看着这个一段时间了。目前最简单的解决方案似乎是 BOOST_FUSION_ADAPT_STRUCT.实际上,一旦你有一个图书馆/头你只需要增加你的结构领域进BOOST_FUSION_ADAPT_STRUCT()宏观, 最后一段代码显示.是的它的限制,许多其他人已经提到。它并不支持的听众。
其他有希望的解决方案,我看到的是
- 营地和XRTTI/gccxml,但是两者似乎是一个障碍带来的外部工具的依赖关系到项目中。
- 几年前我用perl
c2ph
/pstruct
要转储的元信息输出gcc -gstabs
, 那是侵入性较少的,但需要更多的工作,虽然它的工作完全适用于我。
关于提升/__cxa办法,一旦你找出所有的小细节,增加/改变结构或领域是简单的维持。我们目前使用它建立一个自定义的类型结合层之上的d-bus,serialize API和隐藏运输/RPC的详细信息,为托管对象服务系统。
不是一般人,但脱支持通过一元编译器,并且是GPL。我的理解从谈到脱的人,这是不可能有纯C++,因此需要进行商务部.
这是一个臭名昭着的弱点C++语言的一般因为这将需要标准化做出反映实现的便携式和有价值的不是标准。呼吁公约,目的布局,并符号重整的,但也有其他人。
缺乏方向的标准意味着,编译器的实施者将做一些事情不同,这意味着很少人有动机编写一个便携式反射图书馆,这意味着人们需要反思,重新发明车轮,但只是刚刚足他们需要什么。这种情况发生 循环往复, 和我们在这里。
自动反省/反射工具包。使用的元编译器喜欢夸脱的,并添加元信息直接进入目的文件。直观,很容易使用。没有外部的依赖关系。甚至允许自动反映std::string,然后用它在脚本。请访问 。