我在这里遇到了一些挑战。我正在研究一个反射库,作为未来项目的练习和实用工具包。为了使它工作,我已经接受了不可避免的侵入性,我需要在课堂上添加至少一小部分代码。身体得到有价值的反思数据。
但是,我希望在这里尽可能地保持最小化。因此,在研究了一些现有的实现之后,我发现了一个适合我的概念。为简化起见,模式如下所示:
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并且仍然能够进入其成员&#39; RTTI。我希望Base
有一些方法可以在其RTTINFO(...)
中为Derived
走私某些提示以使其成为可能。那么..有吗?
主要要求是:
class Derived : public Base
。RTTIINFO
可能会向受影响的班级添加任何必要的语言和记忆偏差。RTTINFO
宏,如果有必要,甚至可以放大量代码。RTTINFO
宏,当然可以在进一步推断中重复使用。让我们省略多重继承问题,单继承似乎足够复杂。Derived
无需访问Base
的RTTI,它可能是处理RTTI数据的任何其他外部帮助程序类/函数。但是,需要支持私有成员变量。一个注意事项:也许我可以使用type_info::before()
,但即使它适用于常见的编译器,C ++标准也说我不能依赖继承关系。
感谢您的任何建议!
安德鲁
答案 0 :(得分:3)
你不会完全反思当前的C ++ 03或C ++ 11编译器(因为即使是C ++ 11也没有真正的反射)。
您可以生成一些元类代码(以Qt MOC为例)
您可以扩展您的C ++编译器。如果是GCC,请考虑制作插件或MELT扩展程序。
答案 1 :(得分:2)
您可以考虑通过设置一种DSL(域特定语言)和一些代码生成框架来使用代码生成,该框架根据您在DSL中的类描述为您执行反射。这可能仅适用于数据容器和继承部分,而不适用于行为部分(即方法),但正如大多数Java倡导者无论如何都喜欢贫血对象模型,这完全符合这一趋势。
由于C ++具有真正的多重继承性,因此您有能力克服这种缺点并从生成的行为类中派生出行为类。
的Stefan