Genericity-STL 大系.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Genericity-STL 大系

【Genericity/STL 大系】《程序员》2001.02作者简介:侯捷,台湾计算机技术作家,着译评兼擅。常着文章自娱,颇示己志。个人网站:北京镜站:/expert/jjhou 如果有一项技术,可以让你的程序代码处理各种不同的数据型别,甚至是目前未知的资料型别,你喜欢吗?我会欣喜若狂。基本上这就是「可复用性(reusibility)」的表现。当我们有新的数据型态产生,而过去完成的码完全无需修改即可沿用,不正是一种完美的「可复用性」吗?面向对象技术中的多型(polymorphism),以及泛型技术中的泛型(genericity)都可以达到这个目标。它们的字义,也明白标示出其特色。对大多数人而言,polymorphism(多型技术)早已如雷灌耳,genericity(泛型技术)则稍感陌生。这是一个你有必要尽快进入的重要领域。●勤前教育数年前我第一次接触泛型程序设计(generic programming)与 STL(Standard Template Library)的时候,就深深被它吸引。虽然那时候我还不怎么了解 STL 里头一大堆的术语像是 container、iterator、adaptor、function object、allocator…。甚至连泛型技术深度依赖的基本技法 C++ template,当时的我都还只一知半解,但光只「泛型」这两个字就够把我吸引到那个世界里面了。但愿我这么说不至于误导你把泛型程序设计和 STL 划上等号。泛型概念滥觞于 Doug McIlroy 于 1968 年发表的一篇著名论文 Mass Produced Software Components,那篇论文提出了 reusable components(可复用软件组件,又称为软件积木或软件 IC)的愿景。过去数十年中,泛型技术仍属于研究单位中的骄客,实作产品付之阙如。直到 C++ 不断加强 template 机制,并将 Alexander Stepanov 创作的 STL 纳入标准,泛型技术才终于在标准数据结构和标准算法领域中有一套可被大众运用的实作品出现,向现实跨一大步。让我们先复习一下。下面是多型的标准形式:void func(Shape* ps)? // Shape?是某个?class?继承体系的基础类别{ // ... ps-draw();? // draw()?是个虚拟函式?(virtual function)}func() 的呼叫者可以自由传入 Shape 继承体系下任何一个 Shape 衍生类别的对象指针,func() 函式所唤起的将是实际传入之对象(指针)所对应的那个 draw() 虚拟函式。这种写法所带来的好处是,即使将来 Shape 继承体系衍生出前所未见的子型别,只要该子型别本身提供了 draw() 虚拟函式,上面这个 func() 就完全不必更改,可继续使用。那么,泛型又是什么呢?简单地说,这是一种「将数据型别参数化」的思维模式。C++ 的 template 机制就是泛型技术的一个具体载具。在 C++ 中,不论 functions 或是 classes,皆可将其中所需要的数据型别以一个保留器(placeholder)代表,这个保留器亦即所谓的?template 参数。例如 function template:templatetypename T1, typename T2)void func(T1 param1, T2 param2) { /* ... */ }或是 class template:templatetypename T1, typename T2)class A { /* ... */ }从此,一旦程序中使用上述的 func() 或 class A,例如:func(5, 2.3);Aint, double a;编译程序即根据 function template 的函式自变量(上例的 5 和 2.3),或根据被我们明白标示出来的 class template 自变量(上例的 int 和 double),自动推导出一份 function 实体或 class 实体。这个所谓的具现化动作(instantiation)在编译期就完成,不会增加执行期的成本。关于 template 的详细语法与性能,请参考任何一本完备的 C++ 百科型书籍。以上这种「将数据型别参数化,再由编译程序视使用当时的情况,为我们完成实体具现化」的概念,即是泛型的实际展现。template 是 C++ 语言中支持泛型概念的一个工具,而 STL 则是泛型概念的一套实作品。从学理上来说,STL 其实是一套严谨的 concepts 分类学。这里所谓的?concepts?有其严谨定义,意指「对某种型别的某些条件需求」。满足这些条件之型别,称为该?c

文档评论(0)

me54545 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档