RTTI是运行阶段类型识别(Runtime Type Identification)的简称。
C++有3个支持RTTI的元素。
1.如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该运算符返回0——空指针。
2.typeid运算符返回一个指出对象的类型的值。
3.type_info结构存储了有关特定类型的信息。
dynamic_cast运算符是最常用的RTTI组件,它不能回答“指针指向的是哪类对象”这样的问题,但能够回答“是否可以安全地将对象的地址赋给特定类型的指针”这样的问题。
通常,如果指向的对象(*pt)的类型为Type或者是从Type直接或间接派生而来的类型,则下面的表达式将指针pt转换为Type类型的指针:
dynamic_cast<Type *>(pt)否则,结果为0,即空指针。
typeid在c++中,typeid用于返回指针或引用所指对象的实际类型。
注意:typeid是操作符,不是函数!
运行时获知变量类型名称,可以使用 typeid(变量).name(),需要注意不是所有编译器都输出"int"、"float"等之类的名称,对于这类的编译器可以这样使用:float f = 1.1f; if( typeid(f) == typeid(0.0f) ) ……
补充:对非引用类型,typeid是在编译时期识别的,只有引用类型才会在运行时识别。
泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象这样的事;泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含义,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。
泛型编程最初诞生于C++中,由Alexander Stepanov和David Musser创立。目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。
函数模版-一般模版模板函数定义的一般形式如下所示:
template <class type> ret-type func-name(parameter list) { // 函数的主体 }例如:
template <typename AnyType> void Swap(AnyType &a,AnyType &b) { AnyType temp; temp =a; a=b; b=temp; }函数模板有两种类型的参数。
1.模板参数:位于函数模板名称的前面,在一对尖括号内部进行声明:
template //T是模板参数
2.调用参数:位于函数模板名称之后,在一对圆括号内部进行声明:
…max (T const& a, T const& b) //a和b都是调用参数
使用模板:
int a(3),b(4); Swap<int> temp(a,b); 函数模版-重载模版可以像重载常规函数定义那样重载模板定义。
//常规模版 template <typename AnyType> void Swap(AnyType &a,AnyType &b); //重载模版 template <typename AnyType> void Swap(AnyType &a,AnyType &b,int n); 函数模版-具体化和实例化模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化。模板的实例化分为隐式实例化和显示实例化。
隐式实例化