Modern C++ Design
In Modern C++ Design, Andrei Alexandrescu opens new vistas for C++ programmers. Displaying extraordinary creativity and virtuosity, Alexandrescu offers a cutting-edge approach to software design that unites design patterns, generic programming, and C++, enabling programmers to achieve expressive, flC++设计新思维Modern Ct+ designAndrei alexandrescuCopyright (2001 by Addison WesleySimplified Chinese Copyright 2003 by Huazhong Science and Technology UniversityPress and Pearson Education North Asia LimitedAll rights ReeservedPublished by arrangement with Pearson Education North Asia Limited, a PearsonEducation Company版权所有,翻印必究。本书封面贴有华中科技大学出版社(原华中理工大学出版社)激光防伪标签,无标签者不得销售图书在版编目(CIP)数据C++设计新思维/(美) Andrei Alexandrescu著;侯捷於春景译武汉:华中科技大学出版社,2003年3月ISBN7-5609-2906-0I, CⅡ.①A…②侯…③於…夏.C语言-程序设计N. TP312责任编辑:周筠(http://yeka.xitubbs.com)出版发行:华中科技大学出版社(武昌喻家山邮编:430074)录排:华中科技大学惠友科技文印中心印刷:湖北新华印务有限公司开本:787×10921/16印张:21.75插页:2字数:400000版次:2003年3月第1版印次:203年3月第1次印刷印数:1-8000定价:59.80元ISBN7-5609-2906-0/TP·501序言 by Scott Meyersby Scott meyers1991年,我写下《 effective C++》第一版。那本书几乎没有讨论 template,因为它刚刚才被加入语言之中,我对它几乎一无所知。为了书中包含的一点点 template代码,我曾通过电子邮件请别人验证,因为我手上的编译器都没有提供对 template的支持1995年,我写下《 More Efective C+》。又一次,我几乎没有讲述 template。这一次阻止我的既不是对 template知识的缺乏(在那本书的初稿中,我曾打算以一整章讲述 template),也不是我的编译器在这方面有所缺陷。真正的理由是我担心,C++社群对 template的理解即将经历次巨大的变化,我对它所说的任何事情,也许很快就会被认为是陈旧的、肤浅的,甚至完全错误的我的担心出于两个原因。第一个原因和 John barton及 Lee nackman在C++ Report1995年1月的一篇专栏文章有关。这篇文章讨论的是:如何经由 template执行型别安全的维度分析,同时做到运行期零成本。我自已也曾在这个问题上花了不少时间,而且我知道很多人也在寻找解答,但没有人成功。 Barton和 Nackman的创新解法让我认识到, template在太多的地方有用,不只是用来生成“T容器以下是他们的设计示例。这段代码对两个物理量作乘法运算,而这两个物理量具有任意维数的型别templatePhysical operator*(Physical IhPhysicalrhsreturn Physical unit*ihs value()*rhs value()即使我没有说明这段代码,但有一点很清楚:这个 function template有6个参数,可没有一个是型别! template的这种用法对我来说是头-次见到,我确实有点目眩不久之后,我开始阅读STL。在 Alexander Stepanov精巧的程序库设计中,容器( containers)对算法( algorithms)一无所知,算法亦对容器一无所知:迭代器( terator)的行为像指针(但Modern C++ DesignX11序言 by Scott Meyers却有可能是对象):容器和算法像接受函数指针一样地接受函数对象( function object);用户可以扩充程序库,但不必继承其中任何 base class,也不必重新定义任何 virtual function。这一切都让我觉得—就像当初我看到Baon和 Nackman成果那样一我对 template几乎一无所知所以,在《 More Efective C++》中,我几乎没有提到 template。我还能怎样?我对 template的认识还停留在“T容器”阶段,而 Barton、 Nackman、 Stepanov,还有其他人都已证明,那种用法只不过刚刚触到 template的皮毛而已。998年, Andrei alexandrescu和我开始了电子邮件交流:不久之后我意识到,我得再次修正我对 template的认识。 Barton、 Nackman、 Stepanov让我感到震惊的是: template可以“做什么”;而 Andrei的成果最初给我的印象是: template“如何”完成它所做的事情。在 Andrei协助推广的很多工具中,有这样一个最简单的东西;当我向人们介绍 Andrei的工作时,我也-直将这当做一个例子。这就是 CTassert template,作用和 assert宏类似,但施行于“可在编译期间被核定( evaluated)”的条件句中。以下便是 cTAssert templatetemplate struct cfTAsserttemplate<> struct cTAssert tFi仅此而已。请注意,这个 CTAssert从来没被定义。请注意,它有一个针对true(而非 false)的特化体。在这个设计中,“缺少”的东西至少和提供的东西一样重要。它让你以一种新的方式看待 template,因为大部分“源码”被刻意遗漏了。和我们大多数人以往的想法相比,这是种极为不同的思维方式。(本书之中 Andrei讨论了一个更为复杂的 Compl1 eTimecheckertemplate,而不是 CTAssert)后来, andrei将注意力转移到 idioms(惯用手法)和 design patterns(设计模式,尤其是GoF模式)的开发上,提供了 template-based实作品。这导致他和模式社群的一场短暂冲突,因为后者信奉-条基本原则:模式( patterns)无法以代码表述。一旦弄清 Andrei是在致力于使模式的实现得以自动化,而非试图将模式木身以代码来表述,反对声音也就消失了。我很高兴看到和GoF之- John vlissides达成了合作;在C++ Report上,他们就 andrei的研究成果推出了两个专栏。在开发 templates以产生 idioms(惯用手法)和 design patterns(设计模式)实作品时,所有实作者需要面对的各种设计抉择, Andrei也都必须面对。代码应该做到多线程安全吗?辅助存储器应当来自heap或是 stack抑或 static pool?提领 smart pointe之前是否应该针对null进行检查?程序关闭时如果 Singleton的析构函数试图使用另一个已被摧毁的 Singleton,会发生什么事? Andrei I的目标是:为用户提供所有可能的设计选择,但不强制任何东西。4“GoF"意味着" Gang of Four'",指的是 Erich gamma、 Richard Helm、 Ralph Johnson和 John vlissides,他们四人是模式( patterns)权威书籍《 Design Patten: Elements of Reusable Object-Oriented Softuare》( Addison- Wesley,1995)的作者Moden C++ Design序言 by Scott MeyersXIlIAndrei的方案是:将这种选择以 policy classes的形式封装起来,允许客户将 policy classes当做template参数传递,同时为这种 classes提供合理的缺省值,使大多数客户可以忽略这些参数其结果令人瞠目结舌。例如本书的 SmartPointer template只有4个 policy参数,但它可以生成300多个不同的 smart pointer型别,每一个都具有不同的行为特征!满足于 smart pointer缺省行为的程序员可以忽略 policy参数,只需指定" smart pointer所指对象”之型别,从而获得精心制作的 smart pointer class所带来的好处。嗯,不费吹灰之力。最后要说的是,本书叙述了三个不同的技术故事,每一个都引人入胜。首先,它就C++ template的能力和灵活性提供了新的见解—如果第三章的 typelists没有让你感到振奋,定是因为你暮气沉沉)。第二,它标示了一个正交维度( orthogonal dimensions),告诉我们 idioms和 patterns的实现可以不同。对 templates设计者和 patterns实作者而言,这是十分重要的资讯,但是在大多数讲述 idioms或 patterns的文献中你都找不到这方面的研究第三,Loki(本书介绍的 templatelibrary)源码可以免费下载,所以你可以研究 andrei讨论的 idioms和 patterns所对应的 template实际作品。这些代码可以严格检测你的编译器对 templates的支持程度,此外当你开始自己的template设计时,它还是无价的起点。当然,直接使用Lok也是完全可以的(而且完全合法)我知道 Andrei也愿意你运用他的成果。就我所知, template的世界还在变化,速度之快就像1995年我回避写它的时候一样。从发展的速度来看,我可能永远不会写有关 template的技术书籍。幸运的是一些人比我勇敢, Andrei就是这样一位先锋。我想你会从此书得到很多收获。我自己就得到了很多。Scott MeyersSeptember 2000Modern C++ design译序by侯捷前卫的意义侯捷译序般人对C++ templates的粗浅印象,大约停留在“容器( containers)”的制作上。稍有研究则会发现, templates衍生出来的C++ Generic Programming(泛型编程)技术,在C艹标准程序库中已经遍地开花结果。以STL为重要骨干的C十+标准程序库,将 templates广泛运用于容器( containers)、算法( algorithms)、仿函数( functors)、配接器( adapters)、分配器( allocators)迭代器( iterators)上,无处不在,无役不与,乃至于原有的 class-based iostream都被改写为template-based iostream彻底研究过STL源码(SG版本)的我,原以为从此所有C++ templates技法都将不出我的理解与经验。但是《 Moden c++ Design》在在打破了我的想法与自信。这本书所谈的 template技巧,以及捃以实作出来的Loki程序库,让我瞠目结舌,陷入沉思…与…呃…恍惚⊙。本书分为两大部分。首先(第篇)是基础技术的讨论,包括 template template parameters(请別怀疑,我并没有多写一个字)、 policies- based design、 compile-time programming、 recursivetemplates, ypelists。每一项技术都让人闻所未闻,见所末见。第二部分(第二篇)是Loki程序库的产品设计与实现,包括 Small-object Allocation1,Generalization Functors, Singleton, Smart Pointers, Object Factories, Abstract Factory, Visitor,Multimethods。对设计模式2( design patterns)稍有涉猎的读者马上可以看出,这一部分主题都是知名的模式。换言之,作者 Andrei尝试以 templates- based, policies- based手法,运用第一篇成的基础建设,将上述模式具体实现出来,使任何人能够轻松地在Loki程序库的基础上,享受设计模式所带来的优雅架构。1 Small-Object Allocation属于底层服务的“无名英雄”,故而在章节组织上仍被划入第一篇。2 patterns一词,台湾大陆两地共出现三种译法:(l)范式,(2)样式,(3)模式。我个人最喜欢“范式”,足以说明 patterns的“典范”意味。因此,繁体版以“范式”称 patterns。为尊重大陆术语习惯,简体版以“模式”称 patterns本书所有 patterns都保留英文名称并以特殊字型标示,例如obetFactores VisitorsModern C++ design译序by侯捷设计模式( Design Patterns)究竟能不能被做成“易拉罐”让人随时随地喝上一口,增强体力?显然模式社群( patterns community)中有些人不这么认为——见稍后 Scott Meyers序文描述。我以为,论断事物不由本质,尽好口舌之辩的人,不足取也。 Andrei所拓展的天地,Loki所达到的高度,不会因为它叫什么名字而有差异,也不会因为任何人加诸它身上的什么文字包装或批评或解释或讨好,而有不同。它,已经在那儿了。本书涉足无人履踏之境,不但将C++ templates和 generics programming技术做了史无前例的推进,又与 design patterns达成巧妙的结合。本书所谈的技术,所完成的实际产品,究竟是狂热激进的象牙塔钻研?抑或高度实用的崭新设计思维?作为一个技术先锋,Loki的现实价值与未来,唯赖你的判断,和时间的筛选。然而我一定要多说一句,算是对“唯实用论”的朋友们一些忠告。由来技术的推演,并不只是问一句“它有用吗”或“它现在有用吗”可以论断价值的。牛顿发表万有引力公式,并不知道三百年后人们用来计算轨道、登陆月球。即使在讲述“STL运用”的课堂上,都还有人觉得太前卫,期盼却焦躁不安,遑论“STL设计思维和内部实作”这种课,遑论Loki这般前卫技术很多人的焦虑是:我这么学这么做这么写这么用,同侪大概看不懂吧,大概跟不上吧。此固值得关注,但个人的成长千万别被群体的惯性绊住脚步3。我们曾经鄙夷的别人的“无谓”前卫,可能只因我们故步自封,陷自己于一成不变的行为模式;或因为我们只看到自家井口的天空。当然,也可能某些前卫思想和技术,确实超越了庞大笨重迟缓的现实世界的接受度。你有选择。作为一位理性思考者,身在单纯可爱的技术圈内,请不要妄评先锋,因为他实在站在远比你(我)高得太多的山巅上。不当的言语和文字并不能为你(我)堆砌楼台使与同高。深度+广度,古典+前卫,理论+应用,实验室+工厂,才能构筑一个不断进步的世界。侯捷2003/01/08于台湾·新竹Jjhoudccca. nctu. edu. twhttp://www.jjhou.com(#)http://jjhou.csdnnet(an)PS.本书译稿由我和於春景先生共同完成。春景负责初译,我负责其余一切。春景技术到位,译笔极好,初译稿便冇极佳品质,减轻我的许多负担。循此以往必成为第一流I技术译家。我很高兴和他共同完成这部作品。本书由我定稿,责任在我身上,勘误表由我负责。本书同步发行繁体版和简体版:基于两岸计算机术语的差异,简体版由春景负责必要转换。P.S.本书初译稿前三章,邱铭彰先生出力甚多,特此致谢P.S.STL,Boos,Loki,ACE!等程序库的发展,为C++领域挹注了极大活力和竞争力,也使泛型技术在C+领域有极耀眼的发展。这是C艹←社群近年来最令人兴奋的事。如果你在C艹+环境下工作,也许这值得你密切关注3从万有引力观之,微小粒子难逃巨大质量团的吸滞(除非小粒子拥有高能量)。映照人生,这或许是一种悲哀。不过总会有那么一些高能粒子逸脱出来—值得我们转悲为喜,怀抱希望。Modern C++ design译序by於春景译序by於春景三年前,当我第一次接触 template的时候,我认为那只不过是一位“戴上了新帽子”的旧朋友在熟悉的cass或 function的头顶上,你只需扣上那顶古怪的尖角帽—添上一句temp1ate< class T1,.>—然后将熟悉的数据型别替换为T1,m2..,一个 template就摇身而至!嗯,我得承认,戴上了帽子的 template的确是个出色的代码生成器,好似具有滋生代码“魇法”的macro,但毕竟还不能成其为“戴上了帽子的魔术师”。后来,我开始学习GP( generic programming)和STL( standard template library)。我不禁哑然。在GP领域, template竟扮演着如此重要的角色,以至于成为C++GP的基石。在GP最重要的商业实作品STL中, template向我们展示其无与伦比的功效。回想起自己当初对 template的比喻,哑然失笑之余,我惊叹 template在GP和STL中将自己的能力发挥到了“极致”。然而,这一次,《 Modern c++ Design》又让我默然。我不得不承认, Andrei alexandrescu的这部著作(及其 Loki library)带给我的,是对 template和GP技术又一次震撼般的认识!这种震撼感受,源于技术层面,触及设计范畴。 template的技术核心在于编译期动态机制。与运行期多态( runtime polymorphism)相比,这种动态机制提供的编译期多态特性,给了程序运行期无可比拟的效率优势。本书中, Andrei对 template编译期动态机制的运用可谓淋漓尽致。以 template打造而成的 typelist、 small-object allocator、 smart pointer不仅具有强大功能,而且体现了无限的扩充性:将 template技术大胆地运用到 design patterns中,更为 design pattern的实现提供了灵活、可复用的泛型组件在这些令人目眩的实作技术之后,蕴涵着 andrei倡导并使用的 policy- based设计技术。利用这耳目一新的设计思想,用户代码不再仅仅是技术实作上的细节,你甚至可以让代码在编译期作出设计方案的选择!这种将“设计概念”和“ template编译期多态”结合起来的设计思维,将C++程序设计技术提升到了新的高度,足以振聋发聩。Modem C++ design译序by於春景也许只有时间才能证实, Andrei为我们展示的,或许是C++程序设计技术的一次革命;在C++的历史上,《 Modern c+ Design》将是一部重要的著作 Andrei对 template、 generic programming技术,以及 template在 design patterns中的运用等课题所做的深入阐释和大胆实践,可谓前无古人遗憾的是,在当今主流C艹+编译器上,Loki很难顺利通过编译。例如面对" template templateparameter"的“难题”,很多编译器亳无招架之力。应该说,这并不是 andrei和Loki过于超前,而是C++编译器应当迅速跟进。这意味着作为C++程序员的你我,也应当迅速跟进!作为C++程序员的我,已从此书获益良多。这是一部让我在翻译过程中毫不感到倦怠的巨著它时时引发我思索,给我以启迪,并让我重拾研习C++的快乐。这得感谢 Andrei。在这样一部讲述高级技术的专著中, Andrei的讲解细致深入,条理得当,语言却又极为简明清晰。我期望中文版能保留这一特色除了作者之外,在翻译本书的过程中,给我更多教益的还有侯捷先生。我的初译稿便是在先生不断的鼓励和指导下完成的。先生谦和的人品和技术上的深邃见解,令我钦佩和谨记。还要感谢周筠(yeka)编辑,我的每木译作都离不开您的参与和悉心帮助,本书也不例外。最后感谢所有关心我的朋友,愿你们也像我一样喜爱这本书。於春景2002/1/15深圳蛇口,海上世界billyu@lostmouse.netModern C++ Design
用户评论