📄 内容介绍.txt
字号:
内容介绍
Modern C++ Design是一部重要的著作。从根本上,它展示了泛型模式或模式模板这一在C++中创建可扩充设计的功能强大的新途径--一种结合了模板和模式、你未曾梦想过但的确存在的新途径。如果你的工作涉及C++设计及编程,那么,你应该阅读本书。极力推荐...
--Herb Sutter
关于C++,还有什么没有说到的?--很多,它证明。
--节自John Vlissides所作的序言
在Modern C++ Design中,Andrei Alexandrescu为C++程序员开创了新的天地。在展现非凡的创造力和精湛的编程技艺的同时,Alexandrescu提供了融合设计模式、泛型编程和C++的尖端的设计技术,帮助程序员撰写清晰、灵活、具有高度可复用性的代码。
本书提出了泛型组件的概念--一种产生样本代码供编译器使用的可复用的设计模板--一切尽在C++中。泛型组件提供了从设计到程序代码的简便、无缝的过渡,产生出更能表达原始设计意图的代码,并能支持设计结构的复用,但代码只需最少的改动。
作者阐释了构造泛型组件所需的C++专门技巧和特性,然后针对现实世界的应用提供了工业强度的泛型组件的实现。C++开发人员在日常工作中反复遇到的问题在此作了深入的探讨,并通过泛型方式得以实现。这些内容包括:
·可带来高度灵活性的policy-based设计
·模板部分特殊化
·Typelists--用于操纵型别的功能强大的结构
·Visitor、Singleton、Command、Factores等模式
·Multi-method engine
针对每一个泛型组件,本书都提出了基本问题和设计选择,最后实现了其泛型方案。
此外,本书相关网站 httpwww.awl.comcsengtitles0-201-70431-5 给出了书中泛型组件的代码实现,并提供了作者创建的一个免费、可下载的C++库--Loki。Loki为几乎任何C++专案都提供了可借鉴的功能。
Andrei Alexandrescu是RealNetworks, Inc.的一位开发经理。作为CC++ User Journal专栏作家和前C++ Report专栏作家,他在C++领域所做的创造性的工作为他赢得了来自业内领袖的尊敬。Andrei的技术方向包括编程语言、软件复用和数据压缩。
--------------------------------------------------------------------------------
前卫的意义(侯捷译序)
一般人对C++ templates的粗浅印象,大约停留在容器(containers)的制作上。稍有研究则会发现,templates衍生出来的C++ Generic Programming(泛型编程)技术,在C++ 标准程序库中已经遍地开花结果。以STL为重要骨干的C++ 标准程序库,将templates广泛运用于容器(containers)、算法(algorithms)、仿函数(functors)、配接器(adapters)、分配器(allocators)、迭代器(iterators)上头,无处不在,无役不与,乃至于原有的class-based iostream都被改写为 template-based iostream。
彻底研究过STL源码(SGI版本)的我,原以为从此所有C++ templates技法都将不出我的理解与经验。但是《Modern C++ Design》在在打破了我的想法与自信。这本书所谈的template技巧,以及据以实作出来的Loki程序库,让我瞠目结舌,陷入沉思…与…呃…恍惚J。
本书分为两大部分。首先(第一篇)是基础技术的讨论,包括 template template parameters(请别怀疑,我并没有多写一个字)、policies-based design、compile-time programming、recursive templates, typelists。每一项技术都让人闻所未闻,见所未见。
第二部分(第二篇)是Loki程序库的产品设计与实现,包括Small-Object Allocation , Generalization Functors, Singleton, Smart Pointers, Object Factories, Abstract Factory, Visitor, Multimethods。对设计模式 (design patterns)稍有涉猎的读者马上可以看出,这一部分主题都是知名的模式。换言之,作者Andrei尝试以templates-based, policies-based手法,运用第一篇完成的基础建设,将上述模式具体实现出来,使任何人能够轻松地在Loki程序库的基础上,享受设计模式所带来的优雅架构。
设计模式(Design Patterns)究竟能不能被做成易开罐让人随时随地喝上一口,增强体力?显然模式社群(patterns community)中有些人不这么认为 - 见稍后Scott Meyers序文描述。我以为,论断事物不由本质,尽好口舌之辩的人,不足取也。Andrei所拓展的天地,Loki所达到的高度,不会因为它叫什么名字而有差异,也不会因为任何人加诸它身上的什么文字包装或批评或解释或讨好,而有不同。它,已经在那儿了。
本书涉足无人履踏之境,不但将 C++ templates和 generics programming技术做了史无前例的推进,又与 design patterns达成巧妙的结合。本书所谈的技术,所完成的实际产品,究竟是狂热激进的象牙塔钻研?抑或高度实用的崭新设计思维?做为一个技术先锋,Loki的现实价值与未来,唯赖你的判断,和时间的筛选。
然而我一定要多说一句,算是对唯实用论的朋友们一些忠告。由来技术的推演,并不只是问一句它有用吗或它现在有用吗可以论断价值的。牛顿发表万有引力公式,并不知道三百年后人们用来计算轨道、登陆月球。即使在讲述STL运用的课堂上,都还有人觉得太前卫,期盼却焦躁不安,遑论STL设计思维和内部实作这种课,遑论Loki这般前卫技术。很多人的焦虑是:我这么学这么做这么写这么用,同侪大概看不懂吧,大概跟不上吧。此固值得关注,但个人的成长千万别被群体的惯性绊住脚步 。我们曾经鄙夷的别人的无谓前卫,可能只因我们故步自封,陷自己于一成不变的行为模式;或因为我们只看到自家井口的天空。当然,也可能某些前卫思想和技术,确实超越了庞大笨重迟缓的现实世界的接受度。你有选择。做为一位理性思考者,身在单纯可爱的技术圈内,请不要妄评先锋,因为他实在站在远比你(我)高得太多的山巅上。不当的言语和文字并不能为你(我)推砌楼台使与同高。
深度 + 广度,古典 + 前卫,理论 + 应用,实验室 + 工厂,才能构筑一个不断进步的世界。
侯捷 20030108 于 台湾 新竹
jjhou@ccca.nctu.edu.tw
httpwww.jjhou.com(繁)
httpjjhou.csdn.net(简)
P.S. 本书译稿由我和於春景先生共同完成。春景负责初译,我负责其余一切。春景技术到位,译笔极好,初译稿便有极佳品质,减轻我的许多负担。循此以往必成为第一流IT技术译家。我很高兴和他共同完成这部作品。本书由我定稿,责任在我身上,勘误表由我负责。本书同步发行繁体版和简体版;基于两岸计算机术语的差异,简体版由春景负责必要转换。
P.S. 本书初译稿前三章,邱铭彰先生出力甚多,特此致谢。
P.S. STL, Boost, Loki, ACE…等程序库的发展,为C++ 领域挹注了极大活力和竞争力,也使泛型技术在C++ 领域有极耀眼的发展。这是C++ 社群近年来最令人兴奋的事。如果你在C++ 环境下工作,也许这值得你密切关注。
译序(by 於春景)
三年前,当我第一次接触template的时候,我认为那只不过是一位戴上了新帽子的旧朋友:在熟悉的class或function的头顶上,你只需扣上那顶古怪的尖角帽 ─ 添上一句template class T1,... ─ 然后将熟悉的数据型别替换为T1,T2...,一个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 patterns的实现提供了灵活、可复用的泛型组件。
在这些令人目眩的实作技术之后,蕴涵着Andrei倡导并使用的policy-based设计技术。利用这一耳目一新的设计思想,用户代码不再仅仅是技术实作上的细节,你甚至可以让代码在编译期作出设计方案的选择!这种将设计概念和template编译期多态结合起来的设计思维,将C++ 程序设计技术提升到了新的高度,足以振聋发聩。
也许只有时间才能证实,Andrei为我们展示的,或许是C++ 程序设计技术的一次革命;在C++的历史上,《Modern C++ Design》将是一部重要的著作。Andrei对template、generic programming技术、以及template在design patterns中的运用等课题所作的深入阐释和大胆实践,可谓前无古人。
遗憾的是,在当今主流C++ 编译器上,Loki很难顺利通过编译。例如面对 template template parameter 的难题,很多编译器毫无招架之力。应该说,这并不是Andrei 和Loki过于超前,而是C++ 编译器应当迅速跟进。这意味作为C++ 程序员的你,也应当迅速跟进!
作为C++ 程序员的我,已从此书获益良多。这是一部让我在翻译过程中毫不感到倦怠的巨著。它时时引发我思索,给我以启迪,并让我重拾研习C++ 的快乐。这得感谢Andrei。在这样一部讲述高级技术的专著中,Andrei的讲解细致深入,条理得当,语言却又极为简明清晰。我期望中文版保留了这一特色。
除了作者之外,在翻译本书的过程中,给我更多教益的还有侯捷先生。我的初译稿便是在先生不断的鼓励和指导下完成的。先生谦和的人品和技术上的深邃见解,令我钦佩和谨记。还要感谢周筠女士,我的每一本译作都离不开您的参与和悉心帮助,本书也不例外。最后,感谢所有关心我的朋友,愿你们也像我一样喜爱这本书。
於春景 20021215
深圳蛇口,海上世界
--------------------------------------------------------------------------------
目录
译序by 侯捷 i
译序by 於春景 iii
目录 v
序言by Scott Meyers xi
序言by John Vlissides xv
前言 xvii
致谢 xxi
第一篇 技术(Techniques) 1
第1章 基于Policy的Class设计(Policy-Based Class Design) 3
1.1 软件设计的多样性(Multiplicity) 3
1.2 全功能型(Do-It-All)接口的失败 4
1.3 多重继承(Multiple Inheritance)是救世主? 5
1.4 Templates带来曙光 6
1.5 Policies和Policy Classes 7
1.6 更丰富的Policies 12
1.7 Policy Classes的析构函数(Destructors) 12
1.8 通过不完全具现化(Incomplete Instantiation)而获得的选择性机能(Optional Functionality) 13
1.9 结合Policy Classes 14
1.10 以Policy Classes定制结构 16
1.11 Policies的兼容性 17
1.12 将一个Class分解为一堆Policies 19
1.13 摘要 20
第2章 技术(Techniques) 23
2.1 编译期(Compile-Time)Assertions 23
2.2 Partial Template Specialization(模板偏特化) 26
2.3 局部类(Local Classes) 28
2.4 常整数映射为型别(Mapping Integral Constants to Types) 29
2.5 型别对型别的映射(Type-to-Type Mapping) 31
2.6 型别选择(Type Selection) 33
2.7 编译期间侦测可转换性(Convertibility)和继承性(Inheritance) 34
2.8 type_info的一个外覆类(Wrapper) 37
2.9 NullType和EmptyType 39
2.10 Type Traits 40
2.11 摘要 46
第3章 Typelists 49
3.1 Typelists的必要性 49
3.2 定义Typelists 51
3.3 将Typelist的生成线性化(linearizing) 52
3.4 计算长度 53
3.5 间奏曲 54
3.6 索引式访问(Indexed Access) 55
3.7 查找Typelists 56
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -