Boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉。
Boost由C++标准委员会的部分成员所设立的Boost社区开发并维护,使用了许多现代C++编程技术,其内容涵盖字符串处理、正则表达式、容器与数据结构、并发编程、函数式编程、泛型编程、设计模式实现等许多领域,极大地丰富了C++的功能和表现力,能够使C++软件开发更加简捷、灵活和高效。
本书基于2019年12月发布的Boost 1.72版编写,介绍了其中所有的160余个库,并且结合C++11/14/17标准详细、深入地讲解了其中的数十个库,同时实现了若干颇具实用价值的工具类和函数,可以帮助读者迅速地理解和掌握Boost的用法,并将其应用于实际的开发工作中。
本书内容丰富、结构严谨、详略得当、讲解透彻,意在带领读者领略C++最新的前沿技术,相信它会成为每位C++程序员的必备工具书。
一本经过经历10年5版的磨砺、数万程序员的案头查询书!系统阐述历经30个版本更新的Boost标准库的经典技术书!
推荐序
最近一年,我电话面试了数十位C++应聘者,惯用的暖场问题是“您在工作中使用过STL的哪些组件?用过Boost的哪些组件?”,我得到的答案大多为vector、map和shared_ptr。如果对方是在校学生,我一般会问他vector或map的内部实现、各种操作的复杂度,以及迭代器失效的可能场景。如果对方是有经验的程序员,我会追问shared_ptr的线程安全性、循环引用的后果及如何避免、weak_ptr的作用等。如果对方回答得不错,还可以进一步问问他如何实现线程安全的引用计数,如何定制删除动作等。这些问题能让我迅速判别对方的C++水平。
我之所以在面试时问到Boost,是因为其中的许多组件确实可以用于编写可维护的产品代码。Boost包含近百个程序库,其中不乏具有工程实用价值的佳品。每个人的习惯与技术背景不一样,对Boost的取舍也不一样。就我个人的经验而言,首先,可以使用绝对无害的库,如noncopyable、scoped_ptr、static_assert等,学习和使用这些库比较简单。其次,有些功能很容易自己实现,正好Boost里提供了现成的代码,那就不妨一用,如date_time和circular_buffer等。然后,在新项目中,进行消息传递和资源管理可以考虑采用更加现代的方式,如在某些情况下用function/bind代替虚函数作为库的回调接口、借助shared_ptr实现线程安全的对象回调等,这二者会影响整个程序的设计思路与风格,需要通盘考虑,如果能正确使用智能指针,那么在现代C++程序里一般不需要出现delete语句。最后,应对某些性能不佳的库保持警惕,如lexical_cast。总之,在每个项目组成员都能理解并运用的基础上,适当引入现成的Boost组件,可以减少重复劳动,提高生产力。
Boost是一个宝库,其中既有可以直接拿来用的代码,也有值得借鉴的设计思路。试举一例:正则表达式库regex对线程安全的处理。
早期的RegEx类不是线程安全的,它把正则表达式和匹配动作放到了一个类里边。由于有可变数据,所以RegEx类的对象不能跨线程使用。如今的RegEx类明确地区分了不可变(immutable)数据与可变(mutable)数据,前者可以安全地跨线程共享,后者则不行。例如,正则表达式本身(basic_regex)与一次匹配的结果(match_results)是不可变的;而匹配动作本身(match_regex)涉及状态更新,它是可变的,于是要用可重入的函数将其封装起来,避免这些数据泄露给别的线程。正是由于做了这样合理的区分,所以在正常使用RegEx类时就不必加锁。
Donald Knuth在Coders at Work一书里表达了这样一个观点:如果程序员的工作就是摆弄参数去调用现成的库,而程序员不知道这些库是如何实现的,那么这份职业就没啥乐趣可言。换句话说,固然我们强调在工作中不要重新发明轮子,但是作为一个合格的程序员,应该具备自制轮子的能力,非不能也,是不为也。
C/C++语言的一大特点是其标准库可以用语言自身实现。C标准库的strlen、strcpy、strcmp系列函数是教学与练习的好题材,C++标准库的complex、string、vector则是类、资源管理、模板编程的绝佳示范。在深入了解STL的实现之后,运用STL自然手到擒来,并能自动避免一些错误和低效的用法。
为了消除使用Boost时的疑虑,用得更顺手,有时我们需要适当了解其内部实现,甚至编写简化版Boost以进行对比验证。但是由于Boost代码用到了日常应用程序开发中不常见的高级语法和技巧,并且为了跨多个平台和编译器大量使用了预处理宏,所以阅读 Boost源码并不轻松,需要使用者下一番功夫。如果使用者沉迷于这些有趣的底层细节而忘了原本要解决什么问题,恐怕就舍本逐末了。
Boost中的很多库是按泛型编程的范式来设计的,对于熟悉面向对象编程的人而言,或许面临一个思路的转变。例如,你需要熟悉泛型编程的那套术语,如concept、model、refinement,才容易读懂Boost.Threads文档中关于各种锁的描述。我想,对于熟悉STL设计理念的人而言,这不是什么大问题。
在某些领域,Boost不是唯一的选择,也不一定是最好的选择。例如,要生成公式化的源代码,我会首选用脚本语言写一小段代码生成程序,而不用Boost.Preprocessor;要在C++程序中嵌入领域特定语言,我会首选Lua或其他语言解释器,而不用Boost.Proto;要用C++程序解析上下文无关文法,我会首选用ANTLR来定义词法与语法规则并生成解析器(parser),而不用Boost.Spirit。总之,使用Boost时心态要平和,别较劲去改造C++语言,把Boost有助于提高生产力的那部分功能充分发挥出来,让项目从中受益才是关键。
要学习Boost,除了阅读其官方网站的文档、示例与源码,最好能在手边放一本比较全面的中文书,以随时翻阅。对不谙英文的开发者而言,这更是可幸之至。您手上这本《Boost 程序库完全开发指南》就是很好的使用指南与参考手册,在这本书中,作者由浅入深地介绍了Boost的大部分常用内容,能让读者迅速了解Boost,并从中找到自己需要的部分。拿到这本书之后,我有粗有细地阅读了一遍,总体来看,作者水平很高,也相当务实,作者对C++和Boost的理解与运用很到位,我从这本书中学到了不少新知识。为此,我乐于向希望学习Boost程序库的开发者推荐这本靠谱的书。
须知“功不唐捐”,作为一名现代C++程序员,在Boost上投入的精力定能获得回报。
陈硕
《代码大全》译者之一
中国香港
十周年纪念·特别序言
儿时的友情纯真得无忧无虑,长大后的友情真挚得催人泪下,朋友间说不出谢字,我们之间只剩一颗炽热的心。怀念那时每一场“战役”,那屋后白雪皑皑的“堡垒”,那游戏机前的等待。感谢那一只手套,那一个微笑,我们拥有着共同的岁月和青春,叫一声朋友,这个年代,这份友情,没有什么比你更加让我自豪。我的朋友!因为有你,童年才值得回味。就让我们紧握友情,幸福走过……
——小学同学 岳大海
罗剑锋是我的“发小”,那时的他是班级、学校的骄傲,是名副其实的“学霸”,现在的他则是我们这些玩伴的骄傲。他过着让别人羡慕的人生,但我们却知道,这是他一步一个脚印,一步一滴汗水走过来的。他所有的成就我们都有目共睹,儿时的种种经历虽已过许久,却记忆犹新。
他和我们一起疯过,笑过,闹过,奋斗过,拼搏过,那些回忆让人更珍惜我们单纯的情谊。有种惦记疏淡,却很甘甜;有种问候平常,却很温暖;有种信任无言,却最亲切;有种友谊清澈,却最长远。
——小学同学 王峰
我跟老罗是从小认识的,他比我高很多年级,我上初中的时候他好像就参加完高考了。
那时候他一直是我们林场中“别人家的孩子”,不得不说老罗对我的影响挺大的,因为我的父母总教育我打游戏会耽误学习,但是我发现老罗游戏打得好,也没耽误学习啊。所以我对家长的这条教育一直是不屑的。但是后来我发现我错了,因为“既擅长打游戏又不耽误学习”不是适用于所有人的。
老罗打RPG/SLG游戏是高手,他很有耐心,一个游戏通关几遍是常事,然后还会鼓动你多尝试几次,不知道是不是想让他这个“游戏厅老板”多赚点钱。但是他不擅长对战类游戏,在这方面他常常是我的手下败将。
老罗喜欢看书、写书、看电影,当时我很难理解,书有什么可看的,不如多打几盘游戏。问题是他看书看多了,还要写书,这种表现太让人“气愤”了,有时恨得“咬牙切齿”,你说至于么,都是打游戏的人,何必甩我们几条街。看电影也是,看点中国的啊,全是国外的,不知道从哪里整得那么多碟片,我看都看不懂,就记得有部电影里面有个人躲子弹有点厉害。
不说了,人家现在日子过得好,说多了显得我嫉妒他。
——小学同学 袁斌
时光荏苒,岁月如梭,想想认识罗儿(我喜欢这么叫他)已有三十年了,岁月真是把杀猪刀啊!初一入学第一天我们相识的场景还历历在目,如今我的儿子都已经很大了,想想这三十年,我们是真正的好“基友”:初中、高中我们在同一个班,大学我们分开了一段时间,但大学毕业后,我们又来到同一个城市,还在同一个区。罗儿不仅是我的朋友,更是我的兄弟。
罗儿是一个很踏实的人,他做任何事情都会做到极致,我最佩服他这一点。同样是玩游戏,他不仅能通关还能给杂志社写攻略赚稿费。同样是学习,从初一开始,我们这届就没见过别人能考第一,无论你是从哪儿转学过来的,无论题有多难,他一直是我们这届学生中名副其实的“学霸”。我现在还经常用罗儿的事例教育我儿子:“你罗叔叔当年就是这么学的!”
罗儿是一个爱好广泛的人,喜欢迈克尔·杰克逊、郑智化的音乐,还喜欢看《七龙珠》《幽游白书》等漫画。刚开始我都不知道这些是什么,在他的带动下开始接触,也慢慢喜欢。我们总在一起讨论漫画情节,或者在晚自习回家的路上大声唱歌,我对这些事物仅仅是喜欢,但罗儿把漫画插页画出来还集成册,这就厉害了!
最后说到罗儿的书,其实我一点也不懂,真的是“天书”,但是我相信我兄弟,他的书准没错,就像他的人一样!
——中学同学 时吉斌
岁月在不知不觉间潺潺流淌,带走了三十载的光阴,罗剑锋中学时的样子仿佛还氤氲在我的眼前。
毕业后,昔日同窗的情谊没有因为距离增长而愈见稀薄,反而因为时间的酝酿而更加珍贵。闲暇或偶尔出差去北京时,我会与老友点我们最爱的烤鸭,共叙闲话,聊聊儿女,每每都会生出于繁忙生活中偷得闲生的轻松之感。
三十年后的今天,老同学说让我帮他的书写个序,一时感慨良多,说起来这还是我第一次为书写序。还记得初中时罗剑锋一直是班级第一,而我偏是那万年第二,少年的意气当然不允许这样,可惜超过他始终是这些年我未竟的心愿。他始终是我们中学同学的骄傲,记忆中他的眼睛总是那么炯炯有神,好像总有用不完的精力,没有解决不了的难题,在学习中他总能帮助我,而多年之后在与他的闲聊中我也能得到很多中肯的人生建议。
现在老同学在计算机方面颇有研究,并在他自己的领域发光发热。我已经从事财务工作二十多年了,虽然不是很懂电子计算机方面的知识,但是我知道很多日常使用的软件都是用程序编写出来的。这本书应该是每位C++程序员必备的工具书,希望每一位使用这本“宝典”的读者都能像我一样从罗剑锋那里得到用之有益的帮助。
——中学同学 奚春玲
翻看你出版的这部书,回忆初中时代阳光帅气的你,心中满是感动敬佩。我懂得这部书的意义,也能想象出这些数字背后惊心动魄的成长故事。严谨务实,接地行走,方能破万里长风,渡自我沧海。
我清楚地记得,1990年9月1日,我迎来了一届初一新生。眉宇清秀的你举手投足流露着一股不达目的不罢休的执着。你是一个品学兼优的好学生,有远大的志向。从初一到初三,你德智体美全面发展,堪称全才。到现在,我还记得在学校书画展中,你的连环漫画被展出的情景。当时有很多老师和同学都慕名前来,对你笔下那些惟妙惟肖的动漫人物赞不绝口。我还记得你在紧张的学习之余写小说的情景……
你踏实做事,低调做人。作为学习委员,你不仅让自己的成绩一路领先,还能做老师的好帮手、同学的小老师。你是一个很有组织能力的学生,初三毕业时,你和其他同学组织了一次令我终生难忘的集体活动,召集同学们骑自行车去十几公里外的水库旅游景区。当时你不过十四五岁,但是对那次旅游的策划和组织是那么周到。同学们带着钓鱼的工具,带着野炊的锅碗瓢盆,甚至还带上了给自行车打气的气筒和防止跌伤的药物和绷带。一路上,你们几个跑前跑后,照顾着老师和同学。在你们的精心组织下,同学们玩得开心,老师也很放心,这成了我教学生涯最美好的回忆。
回忆三十年前的你,再看到现在你的成就,我倍感自豪。孔子在《易传》里说:“形而上者谓之道,形而下者谓之器。”器者,形也。有形则有度,有度则满盈。而君子不器,就是君子之思不器,君子之行不器,君子之量不器。君子不器,就是不被格局所限,不能囿于一技之长,或满足于一时所得,不能自满,而要不懈地追求。你就是具有不懈追求精神的人。
记取来时路,勿忘本初心。希望你继续奉君子不器,行孜矻之道,矢志追寻,再谱新篇!
——中学老师 邓英
我是罗剑锋的初中物理老师,因为他是一位全面发展的优秀学生,所以给我留下了极为深刻的印象,他朴实、聪慧、善良、勤奋、正直、与人为善、乐于助人……正是这些品质,让他取得了优异的成绩:在“全国应用物理知识竞赛”中获得了省赛区的四等奖,以全局总分第一名的成绩升入高中……这些似乎都“预示”了他今后的发展。
二十多年后再次相见,他已经是一位优秀的计算机专家,并出版了专著。能够有这么优秀的学生我深感荣幸,他有这么优秀的成绩我甚感高兴,祝愿他今后取得更加优秀的成果,造福社会和国家。
——中学老师 邓开林
“宝剑锋从磨砺出,梅花香自苦寒来。”
剑锋,一个从大山里走出来的孩子,带着天真和稚嫩,凭借着勤奋、刻苦、执着的拼搏和追求,从千军万马中脱颖而出,成为大都市里的佼佼者。曾经孤灯夜战、埋头苦读、漫卷长书的身影历历在目……今闻佳作已出,为师心里颇感激动,祝福学生百尺竿头更进步,浩瀚书海苦寻舟,鹏程万里,今年花胜去年红!
——中学老师 练鑫云
“墙裂”推荐,热烈祝贺老八大作出版十周年!
作者是睡在我上铺的兄弟!他是来自黑土地北大仓的上进好青年;是313寝室唯一的学霸,形象气质也符合学霸的特征(当年每次出校园都被盘查身份证、去星海电子市场都被搭讪兜售光盘,足以证明);他是兼职的寝室早饭外卖员、上课代签到员、自习室占座员(占座我们基本也不去)、考试辅导员(不能写太细,你懂的)……
难得的是,出身朴素、身兼数职的罗同学竟然没有被我们带歪,出淤泥而不染地考取了理工计算机“研究僧”,充分证明了是金子总会发光的强大定律!对了,补充一下,“罗桑”还擅长日式游戏(不是那方面的,别想歪了)。
——大学同学 陆程
披阅十载,增删五次,书见厚,发见少。
——大学同学 崔文杰
每个人的职业生涯中总有一些需要特别感谢的人,罗剑锋(Chrono)就是其中之一。
他是我的入职导师,在他的影响下,我开始学习《C++ Primer》《C++标准程序库》,开始学习Boost及设计模式等一系列技术知识。他的设计和实现极致精简,以至找不到任何一行多余的代码,多年后我也是这么要求周围其他同事的,这使得我们的产品线设计和实现风格非常统一。很多新入职的同事在工作过一段时间后,经常会从代码注释里发现原来Chrono就是《Boost程序库完全开发指南》的作者,令他们很兴奋,而我也不失时机地告诉他们:“是的,我很荣幸地和Chrono共事过一段时间。”
祝贺罗剑锋的书发行十周年,这是一本C++程序员进阶之路必看的书。
——同事 张秋香
前几天小罗找我,说自己的书已经出版十周年了,希望我写几句话。
小罗和我多年同事,我觉得他从一个程序员成长为一个大咖,和他做事严谨认真是分不开的。每次他都对程序精益求精,记得他会对编写的每一个文件都加上注释,写上自己的名字。也正是如此,他对于自己的每一段代码都非常重视,这是一个程序员的荣誉吧。
记得他离职几年后,还有新员工问我:“罗剑锋是谁啊?写的程序好牛啊。”祝贺小罗的书发行十周年!
——同事 戚天龙
认识剑锋已经十年了,十年间,他工作、生活、写书、讲课样样都做得精彩。常听人说程序员要经常熬夜,加班是常态,感叹剑锋竟然能在忙碌的工作时间之外做这么多常人不可企及的事。
《Boost程序库完全开发指南》十年间发行5版,足以证明此书的品质。能发掘这样有深度、有价值的好书是每位编辑的梦想,能读到这样的好书是每位读者的幸事。
——本书编辑 袁金敏
罗老师交来的书稿历来是令我最放心的书稿,放心是因为他认真的写作态度,放心是因为他对自己作品珍爱有加,放心是因为他扎实的技术功底,放心是因为他十年的坚持!现在,这本已第五次更新的《Boost程序库完全开发指南》十周年特别纪念版来了,让我们振奋精神,一起随着它品味C++的魅力!
——本书编辑 孙学瑛
十周年纪念·前言
我们的十年
每日埋头忙于工作和生活,等到写下这些文字时才蓦然发现,十年的光阴已经悄悄从身边溜走,不由得发出“逝者如斯夫,不舍昼夜”的感慨。
十年前大多数人还在用电话线“小水管”拨号上网,而十年后光纤宽带100M/200M已是常态。十年前IE浏览器还是上网主流,而十年后Chrome成了绝对霸主……
十年前功能手机正处巅峰,iPhone是刚崭露头角的“贵族”,而十年后智能手机已经普惠大众。十年前3G甫出,手机只能打电话发短信,而十年后5G已经“登场亮相”,各类App争奇斗艳,移动互联网渗透到了生活的方方面面……
十年前电影《阿凡达》刚刚上映,掀起了3D/IMAX的热潮,而十年后3D/IMAX已经比比皆是,但《阿凡达2》依旧遥遥无期……
十年前我的大女儿只有一岁半,而十年后二女儿都已经三岁了……
时间过得好快呀。
C++的十年
十年里的变化实在是太多太多,C++和Boost程序库也是这样。
在这十年里,C++推出了具有里程碑意义的C++11,开启了快速迭代的进化历程。从C++14、C++17一路走来,最新的携带诸多重磅新特性的C++20即将正式发布,令人十分期待。
在这十年里,C++也受到了诸多其他语言的挑战,D、Rust、Go、C#、Java等新老对手轮番上场,在C++的各个应用领域都发起了“猛攻”。但C++作为昔日的“龙头老大”,依然坚守住了一些“阵地”,维持着名声不坠。从TIOBE等编程语言排行榜来看,C++虽然已经不复当年的“王者荣耀”,但还是稳稳地占据着前五名之内的位置,这对一个有着三十多年历史的“老”语言来说算得上是相当难得了。
可以预见,在下一个十年里,C++依然会在底层、系统编程等领域具有优势,它的生命周期还很长,学习、使用C++还是有价值的。
Boost的十年
Boost作为C++的“‘准’标准库”,从十年前本书第1版时的1.42版本,发展到如今的1.72版本,中间经历了30个版本,基本保持着三四个月更新一次的频率。
作为一个“程序库”,它的改变没有语言标准那么“激进”,总体上保持着稳定的态势,仅移除了很少的几个旧组件(coroutine、minmal test、signal、tr1),同时其内部不断重构、优化、提升性能,还增加了数十个新组件。
通过这种严谨务实的做法,Boost一方面继续兼容不同的C++标准,另一方面又持续地扩充着C++的能力,为广大程序员提供了一个庞杂而可靠的“编程武器库”。无论你使用什么操作系统、编译器、语言标准,总能在Boost里找到称心如意的好东西。
十年的时间再次充分证明,“‘准’标准库”的名头绝非浪得虚名,而是实至名归。
不过随着C++标准和vc、gcc、clang等编译器的发展,越来越多的Boost组件都开始要求启用C++11了,这也算是件好事,毕竟C++98太“古老”了,适当地推动一下语言标准升级,对于你我来说,今后敲键盘的工作也能轻松一点。
本书的十年
本书第1版主要的开发环境是Windows和VC。到了第2版开发环境变成了Windows与Linux并重。随后的第3版和第4版,因为我的工作逐渐转移到了Linux,所以就放弃了Windows,全面采用了Linux和gcc。这些变化也反映了C++应用场景的变迁:由客户端转向服务器端开发。
关于本书的内容,因为编写本书第1版时C++11还未发布,只能使用C++98,所以第1版中重点介绍了Boost库里模拟C++11各种新特性、能够简化代码的组件,如typeof、foreach、result_of。编写本书第2版的时候C++11刚发布不久,编译器的支持还比较弱,只适当加入了少量C++11的内容。而在编写本书第3版和第4版的时候,各大编译器对C++ 11的支持已经很完善了,就完全采用了C++11,删去了旧版里许多过时的内容。
随着时代的前进,C++变得越来越“大”,Boost也变得越来越“大”,想在一本书(即使它很厚)里囊括所有内容已经成为一个“不可能的任务”。 所以这次的修订我放弃了全面翻新的想法,而是尽量让这本书保持稳定,不引入过于复杂、高深的组件,只介绍Boost里最基本、最有用、最常用的知识[① 想更深入了解C++/Boost程序库可以参考附录A的推荐书目[3]。]①。
希望本书能够成为Boost世界的“新手村”,无论是谁,都可以在这里磨炼、休息,在积累足够的经验后,再迈向外面的广阔天地。
十年感言
“十年之前,我不认识你,你不属于我。十年之后,我们是朋友,还可以问候。”
无论是新读者还是老朋友,我都衷心地感谢您对这本书的支持,祝愿我们都能在下一个十年里取得更大的进步,赢得更多的成功!
2020年2月20日 于 北京 798园区
第1版前言
屈指算来,接触C++语言至今已经有十余个年头了。回首往事,不禁感慨良多。
缘起
1996年,我上大学最开始学的是Pascal,不得不说,Pascal的程序风格严谨,确实很适合作为一门教学语言,然而用于实际开发它就不那么合适了(直到出现Delphi)。由于当时学校并未开设C语言课程,所以在Pascal课程结束后,我就买书自学C/C++语言,并在次年报名计算机软件专业的技术资格和水平考试,靠着一点点编程和考试的“天分”获得了高级程序员资质(当年很热衷考级考证,后来就“淡定”多了)。虽然有了资格证,但我仍然是个C++的初学者,对于C++的认识还处于C的面向过程和简单的基于对象层次上。
新千年伊始,我考入了北京理工大学就读研究生,因为跟导师做项目开始接触STL与C++标准库,大概是2005年从1.33版开始接触Boost,这才真正领略了C++的精髓。那段时期,Java和C#正在国内大行其道,C++则势单力薄,有关STL和C++标准的技术书籍寥寥无几,更没有讲解Boost的书,故对Boost的学习基本只能靠自己的摸索与实践。好在Boost自带的文档的内容相当丰富(尽管看全英文的资料十分辛苦),而且其源码也比较清晰规范,在熟悉了STL的基础上学习Boost倒也不算太难。
但Boost的一个最大的特点就是“庞大”,其功能组件众多,要想把它全部装进脑子里融会贯通基本上是不可能的,使用Boost时需要经常查阅英文文档,相当麻烦。因此,在学习的过程中,我逐渐产生了编写学习笔记的想法。一开始的学习笔记只是简单的纯文本文件,记录了一些使用经验,随着不断累积,纯文本形式已经不能够满足我整理知识的需求了,于是我又把这些文字迁移到了Word文档里,并把这些使用经验分类编目,进行较系统的归纳梳理。慢慢地,这份学习笔记居然有了上万字的规模,成了一份很好的Boost备忘参考,它在日常的开发工作中给了我很大的帮助。就像《设计模式》一书中所说的那样,我捕获了很多使用Boost解决问题的实践经验,避免了重复发现。不过,这份资料一直仅限于我个人使用,属于“自娱自乐”的作品,从未示人。
时间一晃,到了2010年1月份的某天夜里,不知道是什么原因,我忽然失眠了,躺在床上翻来覆去怎么也睡不着。突然,一个念头闯入了我的脑海:把Boost开发经验整理出版吧,让更多人能够分享这些知识,正所谓“独乐乐,与众乐乐,孰乐”。这个大胆的想法的出现让我那天的失眠又延长了几个小时——关于书的各种构想在我的头脑中“肆虐横行”。
随后的几天里,我就把这个想法付诸行动了,虽然以前写过并发表过很多文章,也在网上印刷了几本个人文集,但出版正式的书还是第一次。在把学习笔记进一步整理完善,编写出较完整的结构和一个样章后,我就开始联系出版社了。当初并没有多大的信心,毕竟我这个作者名不见经传,也没有什么资历、背景和名气(而且还是个“网盲”,从未跟随潮流开个人博客)。很幸运,我发出的第一个E-mail就是给电子工业出版社发的,而且编辑也在第一时间回复了我,这才给了我持续写作完成全书的动力。
在写作过程中,我也进一步加深了对Boost的认识,弄清了许多原来未曾注意到的细节。原本我只打算写20万字左右、三百多页,但写到中途,我发现Boost库的博大精深远非我当初的理解,也意识到了自己当初的学习比较肤浅。我历经了近半年近乎不眠不休的努力,最终呈现给读者的是这本厚达500多页的图书,本书的文字量是最初的学习笔记的数十倍,其内容也翔实丰满了很多——达成这个结果,我个人可以说是问心无愧了。
C++与Boost
与Java和C#等语言相比,C++最大的不同之处在于它并非由某个公司或个人把持的,它真正的发展动力来自广大的程序员。Boost就是这样的一个典范,它成功地填补了从C++98到C++0X这“失落的十年”间的空白,在竞争对手Java和C#不断更新版本、新增特性的时候以库的形式极大地增强了C++的能力,使C++不至于因为标准规范的滞后而落后于时代,而且Boost还深层次地挖掘了C++的潜力,开创了泛型编程、模板元编程、函数式编程等崭新的境界。
就个人来说,我比较喜欢的Boost版本有两个,分别是1.35版和1.39版。1.35版增加了asio、bimap、circular_buffer等许多重要组件,而1.39版则增加了signals2库,这两个版本都在我的工作用机上停留了相当长的时间。落笔之时,Boost已经更新到了1.43版,成长为一个相当完善、全面、强大的C++程序库。可以毫不夸张地说,现在的C++程序员,如果不熟悉Boost,那么他至少会丧失一半使用C++的好处,同时会多耗费数倍的开发精力和时间。
随着C++0X标准即将来临,Boost程序库的发展也出现了加速的趋势,由原来间隔数月不定期更新版本,改为定期(每3个月左右)发布新版本,而且每个新版本都会包含大量极有价值的更新内容。因此,希望读者在阅读本书时及时访问Boost的官网(http::// www.boost.org),以便获取最新的版本。
感谢读者选择本书,再说一句真心的“套话”(笑):限于作者水平有限,书中错漏在所难免,敬请读者原谅、指正。
致谢
首先,我要感谢整个C++群体,特别是C++语言的发明者Bjarne Stroustrup博士——他给我们带来了美妙的C++;然后是Alexander Stepanov和C++标准委员会——他们把STL引入了C++,开创了C++的现代编程风格;以及Beman G.Dawes、Boost程序库的所有作者和Boost社区——他们为我们奉献了如此高水准的程序库。
其次,我要感谢电子工业出版社博文视点公司,他们给了我这个把自己的开发经验出版成书的机会,在把潦草的个人学习笔记变成正式图书的过程中,他们付出了艰辛的努力。还要感谢陈硕先生,他审阅了本书的部分手稿,提出了很多有价值的参考意见,并慨然为本书撰写序言。
再次,我要感谢我的家人:感谢我的父母和弟弟,他们永远是我生命中最重要的人;感谢我的妻子,她自始至终都支持我写作,并担负了大部分照顾孩子的家务(虽然偶有怨言);我还要对已满一岁半的女儿说声抱歉,为了写作本书,我牺牲了很多陪她玩耍的时间。
再次,我还要感谢黄美华、冯薇、戚天龙、罗玉震、颜静、陈刚、张秋香、缪泽波等同事,长期的共事令我们建立了深厚的友谊。在此,我要对后两位同事致以特别的感谢,他们对完成本书的写作提供了大力的支持和帮助。
最后,感谢多年以来的好友岳大海、时吉斌、王峰,感谢我的中学老师邓英、杜爱芹、练鑫云、陈静,感谢我的研究生导师贾云得,以及所有在我成长过程中曾经给予我关心和帮助的朋友们!
罗剑锋
2010年6月7日 于 北京 王府井