c – 实现反射:如何查找类的父级
作者:互联网
我在这里有一种挑战.我正在研究一个反射库作为未来项目的练习和实用工具包.为了使它工作,我已经接受了侵入是不可避免的,我需要在类的主体上添加至少一小部分代码以获得有价值的反射数据.
但是,我希望尽可能地尽可能地保持最小化.因此,在研究了一些现有的实现之后,我发现了一个适合我的概念.为简化起见,模式如下所示:
class Base
{
int baseFoo;
double baseBar[5];
RTTINFO(baseFoo, baseBar);
};
(...)
Base sth;
std::cout << TypeInfo(sth).variables[0].name; << std::endl;
// I don't mind if the way of accessing the type info changes totally
使用一些通用编程,我可以实现隐藏在RTTINFO宏和构建类型信息结构背后的任何东西.我可以检索类型,名称,数组大小等.但是当我想更进一步并引入继承时,像这样:
class Derived : public Base
{
std::string foo;
char* bar;
/* RTTIPARENT(Base); <-- I want to avoid this */
RTTINFO(foo, bar);
};
然后我想避免指定Base并且仍然能够进入其成员的RTTI.我希望Base有一些方法可以在其RTTINFO(…)中走私一些提示以使其成为可能.那么……有吗?
主要要求是:
>除了语言定义的地方,我不想在任何地方指定基类.而且我不想在任何宏中包装类Derived:public Base.
> RTTIINFO可能会向受影响的类添加任何必要的语言和内存偏差.
>我可以将任何我想要的东西放入RTTINFO宏,如果有必要,甚至可以放大量的代码.
> Base和Derived都使用完全相同的RTTINFO宏,当然可以在进一步推断中重复使用.让我们省略多重继承问题,单继承似乎足够复杂.
> Derived无需访问Base的RTTI,它可能是处理RTTI数据的任何其他外部助手类/函数.但是,需要支持私有成员变量.
>我不介意编译和运行时成本 – 如果任何计算,如构建继承树,轮询所有现有类,无论如何,必须在运行时完成,总有一种方法可以将它移动到程序的初始化阶段,所以不是对我来说很重要.
>如果可能,请避免使用语言支持的RTTI,因为在某些项目中必须关闭它.无论如何,我甚至没有找到解决方案.
>不能添加额外的编译步骤.
一个注意事项:也许我可以使用type_info :: before(),但即使它适用于常见的编译器,C标准也说我不能依赖继承关系.
谢谢你的任何建议!
安德鲁
解决方法:
你不会完全反思当前的C 03或C 11编译器(因为即使C 11也没有真正的反射).
您可以生成一些元类代码(将Qt MOC视为一个很好的例子)
你可以扩展你的C编译器.如果是GCC,请考虑制作插件或MELT扩展名.
标签:generic-programming,c,reflection 来源: https://codeday.me/bug/20190902/1790798.html