• 全部
  • 问答

标准C++中的RTTI好像功能很有限啊!

0602 2002-08-05 05:55:27
我以前是做java的,最近有些东西要用C++来写,可是用起来才发现C++的RTTI好像与java的reflect机制相差太远了,我随便定义一个void*类型的变量,然后给他一个string*类型的值,用typeid()怎么也取不出string类型来(或者basic_string<>等等)。
不知道是我的水平有限,还是C++在这方面的水平有限:),各位C++高手可以帮我看看解决这个问题吗?
...全文
8 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
TopCat 2002-08-06
you can try to see "boost", it may help you.
回复
Tommy 2002-08-06
SHIZUMARU(绯雨闲丸) :

这还是有一定的用途的,不过要小心使用就是了。
在我自己的项目中,在一个PlayList列表,每一项是一首音乐CSong,音乐有CMp3Song、CWaveSong等格式。我就需要将CMp3Song、CWaveSong等放到一个列表中,你说,列表应该是什么类型呢?vector<CSong>?这会把CMp3Song等对象截断为CSong对象,用vector<CSong*>?谁去释放CSong*的指针?这时候,一个能同时容纳不同类型的容量就很有用了:)

我最后是用了boost::shared_ptr实现的,不过我想用boost::any也是可以的,都可以保证类型安全。

不过,像楼主那种用法似乎有点太过了,是C的做法,不是C++中所提倡的:)
boost::any应该有点帮助。不过我也没有用过。
回复
0602 2002-08-06
我看了一些资料,的确,RTTI适用于类的继承体系,可是,我要做的是一个map,其中的value部分可以保存任何类型的内容(比如double,int,string,bool,甚至另一个map等等),而且可以在运行期检测到他们的正确类型。不用void*用什么呢?这个问题C++就无法解决吗?
回复
SHIZUMARU 2002-08-06
你为什么要这样做?像Java的Collection那样,把一个东西放进容器里面,再取出来的时候就变成了Object,难道你不觉得这很龌龊吗?强类型的编译器可以帮助你做静态类型检查,你却想方设法要去绕过它。那你干脆去用Python好了,干吗还要用C++呢?
回复
prototype 2002-08-06
maybe 是C++在这方面的水平有限:). haha.
c++'s rtti applies to a inheritance hierachy system. is 'string' derived from 'void*'?
回复
Tommy 2002-08-06
C++的RTTI是建立在vtable的基础上的,没有vtable的话是得不到RTTI信息的,不像Java,所有东西都从同一个根类派生。所以不可能对void*取RTTI信息。

你的问题,我想可以参考一下boost::any,CSDN上前几天才有文章专门介绍这东西,这个对象可以容纳任何类型,而且是类型安全的。用了any,你就不必自己做了,map<any>就可以实现你要求的功能

回复
huxw 2002-08-05
rtti不是什么好东西,c++本来就没怎么想支持它。
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-08-05 05:55
社区公告
暂无公告