资源描述:
《c++参数化类型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Articlesof兮软使用C++的语言内模板的方式:参数化类型2011-09-2105:09:39minlearn(%)使用C++的语言内模板的方式:参数化类型我们这里讲解的是C++的语言内的advancedoo技术。当然.将设计做到语言内的,还有Python的descorator和generator等.TOC1实例化2参数推导3模板与泛型编程4泛型的抽象意义5traits,concept,model6iterater7adapter8真正的策略9C++中的编程层次与设计层次10C++中的元编程11泛型编程其实是一
2、定程度上的自然语言编程实例化首先我们要弄懂实例化,它本质上是一种编译器技术.它对我们编程带来的功能就是:编译期参数化推导.参数推导给C++带来强大语言能力的机制(泛编程和元编程),也给我们带来了不小的学习曲线.这节先讲实例化,下一节将着重谈参数推导.什么是实例化呢?注意这个字眼在OO程序设计中,由一个class定义一个对象并不实际动态分配内存,因为这还是指为运行期作规划的设计期并没有实际进入到运行期并分配了一个内存,如果用了new关键字,还是没有分配内存(因为是在写源程序的时机没有运行),编译期永远不实际分配内存而只
3、是在作某种分配计划,只是按照源程序所写为程序将来在运行期如何获得内存作分配上的控制而已,,这是一种针对运行期的实例化.可是编译器不光是指运行时,还指编译器前端的转换,实例化并不一定指为运行期实际实例化(也就是说实例化并不一定就是一种“为运行而作设计”的写源程序动作,,它还可以是一种“为设计期而作设计”的写作动作,)它其实就是一种编译期的宏,只不过它有类型的判断,因此远远不是简单的文字替换性质的宏,,而是一种编译技术,模板由于有这个特性,第一,因为它是泛型,所以为C++带来泛型编程机制,第二,因为模板编译技术的图灵完备
4、,它使C++编译器也有解释能力(只能解释那些在不使用到运行时,等运行期设施时),这也就是说,它有运行能力,这给模板给C++带来元编译技术.这种实例化就是针对编译器本身的实例化.所以说,实例化是多义的,针对运行时和编译器前端的实例化,只不过一个实例化用了不同的情景而已什么是元呢?元就是大一,古人常常把世界归为,金木水火土,企图用这些东西作为其它一切事物的“原型,元素”来描述其它事物,比如它们说“水主..金主XX”,所以,元,就是描述其它东西的那个上上层原型.即我们通常的编程1是面向运行期的,而不是面向程序如何被编译的(
5、编译器),这就是说,我们编制的程序只会运行,编译器只管转换的事.那么如果现在我们想将设计推早到针对编译转换发生的时候呢,即如果对转换动作也在源程序级作控制呢?这在C++中同样存在,这种控制编译的手段之一便是:预处理,编译器宏设施(稍后会谈到模板的实例化也可以达到这样一种效果).让我们回顾一下编译原理,编译,运行,前端,后端诸如此类的概念,我们知道高级语言的过程,词法分析和语法分析构成了编译器的前端(得出一个抽象语法树),然后是语义分析,然后是中间码或目标码生成(如果有一个虚拟机,比如JVM和JAVA语言,那么这个目标
6、码就是JVM中解释器要执行的目标,如果是裸机器本身,那么就是一种接近二进制但不是最终二进制的表示形式,当然一般在生成最终目标码之前要先生成中间码),然后是对生成的目标码进行优化,优化之后进行汇编形成真正的二进制.但其实编译非运行,我们知道运行期才能申请到系统资源,才能进行计算机的所谓运算,其实对编译期和运行期的误解一切的罪原是解释语言跟编译语言的区别(如果没有编译后端,那么运行期的目标就是中间代码即源程序初步变换了的形式而不是目标平台的程序),我们知道,在编译前端完全之后,代码就被生成了,对于解释器来说,编译后端是不
7、必需的,此时它就是逻辑上可运行的一个整体..即设计逻辑=编译结果=最终运行逻辑..只有等编译后端是为具体平台生成代码时,,这个时间才出现第二个运行期,,要打乱设计逻辑,将语法级译后端是为具体平台生成代码时,,这个时间才出现第二个运行期,,要打乱设计逻辑,将语法级的编译时的设计逻辑转化为变相的平台逻辑,运行时就可以申请到系统资源了..(因为类似C++编译器它的编译部分和运行部分是他大爷的分开的),,这才是运行时的标准定义..而模板绝非为后一个运行期而存在,它在中间代码层次上就可以工作了,因此模板中可以不需要分配变量这些
8、运行资源2,它可以只是关于类型的纯语法逻辑(这就是利用了模板的元编程,注意,要把模板实例化技术跟元编程范式分开).因此类型也可以仅仅是一个语法占位符(很难想象类型占位符也能参与运算吧).就跟宏一样..在写模板时并不产生代码,只有模板逻辑被实际调用时才被生成代码(即编译实例化时,类型将不再是一个占位符,而是获得指明的一个具体类型,可以进入编译了)