Visual C++ 2005新特性之泛型编程
1、两种泛型机制
(1)编译时泛型——C++:编译时实例化、基于签名的隐式约束
(2)运行时泛型——Visual C++ 2005:运行时实例化、基于“基类+接口”的显式约束
2、三种泛型应用
(1)在C++的本地类型上应用模板(编译时泛型)
(2)在CLI托管类型上应用模板(编译时泛型)
(3)在CLI托管类型尚应用CLI泛型(运行时泛型)
3、Visual C++ 2005所支持的泛型程序库
(1)标准模板库STL
(2)CLI标准模板库STL.NET
(3)CLI泛型库System::Collections::Generic
4、CLI泛型基本结构示例
generic <typename T> //声明一个泛型栈,generic对应templete,typename对应class
public ref class Stack
{
public:
T Pop();
void Push(T t);
int Size();
…
}
Stack<String^>^ sStack; //使用String^实例化泛型栈
Stack<int>^ iStack; //使用int实例化泛型栈
5、泛型机制
(1)第一轮编译时,只产生“泛型版”的IL代码与元数据而并不进行泛型类型的实例化;
(2)JIT编译时,对第一次遇到的各种泛型类型进行实例化;
(3)CLI为所有类型参数为ref class的泛型类型产生同一份代码;类型参数为value class时,在针对每一个不同的value class,CLI将为其产生一份独立的代码。
6、泛型机制特点
(1)由于CLI泛型类型的实例化会推迟到JIT编译阶段进行,因此未经实例化的泛型类型会存在于编译生成的程序集中(assembly),成为一个类型实体;
(2)如果实例化泛型类型的参数形同,JIT编译器会重复使用该类型,避免了代码膨胀;
(3)CLI泛型类型携带有丰富的元数据,因此可以通过反射来获取程序集中的泛型类型的相关信息。
7、CLI泛型适用对象
(1)CLI托管类型(包括引用类型与值类型)
(2)CLI接口类型
(3)CLI委托类型
(4)函数(成员函数、全局函数)
CLI泛型不适用于C++本地类型(缺乏元数据)、CLI属性、事件、索引器和操作符。
8、类型参数约束
(1)CLI泛型采用 “基类+接口”来实现对类型参数的显式约束(约束必须写出来);
(2)CLI泛型不能采用C++模板所使用的基于签名的隐式约束。
我思故我在