![]() |
1
5
如果你正在寻找一个完全通用的方法来在运行时操纵对象,当你在C++中不知道编译时的类型时,你基本上需要:
现在,假设
这种方法假定您在编译时知道所有相关的接口。 如果你不这样做,你无论如何也不能用普通的C++语法来调用方法。但很难想象呼叫程序不知道什么情况 界面 它需要——关于我唯一能想到的情况,如果你想通过交互解释器公开C++对象。即使这样,您也可以设计一种(丑陋的、维护密集型的)方法,将其引入上述范式,以便通过将方法的名称和参数指定为字符串来调用这些方法。
另一个需要考虑的方面是
对象创建
.要在不知道具体类型的情况下完成这一点,您需要一个工厂函数,加上类的唯一标识符来指定您想要的具体类。可以安排类在启动时向全局工厂注册,
as described here by C++ expert Herb Sutter
--这样就避免了
一天结束时,你最终得到的基本上是(同构于)
COM
——
|
![]() |
2
15
由于C++标准不包括“元数据”这样的概念,所以除了您已经提到的RTTI之外,没有可移植的(跨不同的编译器和平台),这是运行时反射的方法。
在C++中,也有编译时间反射的可能性(思考)。
大多数主要框架(MFC、Qt等)允许您在运行时提取元信息,但它们需要各种特殊的注释才能使其工作(请参见 RUNTIME_CLASS 以此类推)。 |
![]() |
3
4
看一看 my answer to a similar question . 这两种解决方案(xrti和openc++)都是基于在构建过程中为您生成反射元数据的外部工具提出的。 |
![]() |
4
3
你需要使用访客模式。任何可以反映的类都需要继承一个基类,该基类为
许多流行的库在特定的情况下使用这种模式,例如
您可以设计一个系统,使访问者能够动态调用成员函数、获取或设置数据成员的值等,但是每个类都有责任维护
|
![]() |
5
1
RTTI是一种解决方案(Java中的哪一部分您认为不是RTTI?)否则,你可以实现你自己的对象框架——让每个你自己的C++对象继承一些反射接口,然后它应该工作。 |
![]() |
6
1
反射是计算机程序观察和修改自身结构和行为的过程。我不知道如何在C++中进行反射。RTTI只对运行时内存中对象的数据类型有用。 |
![]() |
7
0
如果您将它用于依赖项注入(某个接口^h^h^h^h^h^纯抽象类的实现),则可以尝试动态加载.dll或.so文件,这些文件包含插件的任何内容的当天实现。 可能只是抓住了稻草,因为这对同时实现多个事物来说不太好。 |
![]() |
8
0
在C++中你需要做什么,你在用什么平台?我知道一种使用这些数据获取完整类定义和调用函数的方法,它在Windows中工作,但我不知道其他平台。其思想是从dll或exe导出表中获取数据。这并不容易——我们花了几个月的时间才得到一个像样的实现——但是它将做反射支持语言所做的一切。 |
|
user29759326 · 如何返回递归函数中的最后一个值? 5 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 5 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 5 月前 |
![]() |
rudraraj · java中未声明最终变量 6 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 6 月前 |