C++实现RTTI具体操作经验总结

开发 后端
C++实现RTTI的操作中需要注意几个重点,比如:必须满足特定语言的定位和要求;必须是尽可能透明的;尽可能轻便以及高效等等。

 C++编程语言中的RTTI的实现,在一定环境中起着非常重要的作用。我们在这篇文章中就会针对C++实现RTTI的操作方法进行一个总结,希望大家可以根据我们总结的经验,来充分掌握这一应用技巧。#t#

RTTI(运行时类型信息),是所有RAD开发工具的基础。这段时间,因为需要在自己的软件中加入扩展的RTTI功能,于是专门对RTTI进行了研究,现在一些心得写下来。

RTTI是比较新的编程语言提供的能力,C、Fortran、Basic就没有,而现在几乎所有现代的、可视化的编程语言都提供了RTTI功能。C++的标准中也对RTTI作了规定。但相对其它语言而言,C++的RTTI信息是最简单的。

一、RTTI典型的应用需求

1、类型的识别,即能在运行时判断出某对象、表达式等的类型,能判断它们是基本类型(int、string),还是对象,以及它们区别于其它类型的标识;

2、对象的继承关系的运行时判断;

3、在出错处理、内存诊断等处理时的输出信息;

4、基于字符型名称的运行时对象访问、方法调用;

5、对象的自动保存和读入;

6、基于ID或名称的对象自动生成;

7、环境配置的保存和读入;

8、程序自动生成;

二、C++实现RTTI

RTTI最直接的实现是通过编程语言的语法支持功能,由编译器自动完成,比如:Delphi等语言就提供了Property关键字。C++语言没有这些语法支持功能,因为C++不是一种RAD语言,可以将VB、Delphi、Java等与之进行对比。C++的RTTI是最简单的,只能获得类名和相关的继承信息;而VB、Delphi、Java等确复杂得多,甚至于支持属性名、方法名、事件名等。

标准C++ 提供了typeid() 操作,以得到类型信息,它的参数可以是一个表达式,可以是一个对象、指针或者引用,通过这个方法,可以得到一个指向常type_info对象,里面包含了这个表达式的类型必要的信息。type_info对象提供的功能有如下这些:

1、name(),可以得到一个包含类型信息的字符串,返回如:"int"、"MyClass"等;

2、before(),用来在类型列表中遍历;

3、==操作,用来判断类型是否相同;

VC中的MFC提供的RTTI实现与C++提供的差不多,但是有一些功能上和实现在的差别,但也只是提供了名称和比较功能。
不能说,这是C++或VC中的缺陷,这是由C++的定位决定了,如果C++加上了复杂的RTTI信息,则C++可能就变成了C#或别的什么语言了。是的,C#增加了比较复杂的RTTI信息,谁让他的主设计者就是从Borland公司过去的呢(这也决定了C++在.NET框架中的会被淘汰的命运,因为它在.NET中没有合适的定位,就象VF被淘汰一样)。

三、C++实现RTTI的要点

作为一种语言的新特性,RTTI的实现,应有如下要求:

1、必须满足特定语言的定位和要求,不能说,将所有可能的功能加进去就是好东西了;

2、必须是尽可能透明的,RTTI的主要应用在IDE和底层,一般情况下,编程用户不需要了解过多的RTTI细节,比如:作为Delphi用户,他只需要基于属性的访问方法,只需要知道基于组件的保存方法,不需要了解RTTI在其中所起的作用,就象电视机的使用者不需要了解电视机的原理;

3、尽可能轻便,不能因为实现RTTI要耗费大量内存和CPU时间,不能占用太大的程序空间,当然,这个要求是相对的,

4、尽可能高效

5、作为RTTI的实现者,应该尽可能在定义了功能集的情况下,以幽雅的方法实现之。

C++实现RTTI和执久化是通过宏来完成的,幽雅吗?算是吧。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-02 17:13:35

C++ Endian

2010-02-03 13:26:53

C++计时

2010-02-02 16:23:46

C++实现WPF动画

2010-02-02 15:44:18

C++遍历集合

2010-02-01 15:18:40

C++ new用法

2010-02-02 13:57:31

C++解析#pragm

2009-09-18 10:21:13

C#数组C#串操作

2010-03-24 10:06:37

Python嵌入C++

2009-09-08 10:57:55

LINQ查询操作

2009-09-11 13:29:31

LINQ查询操作

2009-08-13 18:13:27

C#学习经验

2009-09-01 13:00:05

C#实现Windows

2009-08-21 17:42:36

C#调用API

2009-08-11 14:20:41

C# .NET学习经验

2009-08-24 14:56:01

C#连接Access

2011-03-17 09:06:58

iptables映射端口

2009-12-30 15:47:40

Silverlight

2010-05-06 15:04:54

Oracle建立DBL

2010-01-15 15:51:43

VB.NET类添加方法

2009-10-15 09:27:00

点赞
收藏

51CTO技术栈公众号