写在C++图书出版史上又一部经典著作问世之前

      ——写在C++图书出版史上又一部经典著作问世之前

C++图书界沉寂久矣!

至少我是这么认为的。国内引进第一批C++经典书籍的时候我是亲历的。感觉真是“忽如一夜春风来,千树万树梨花开”。别误会,我说的这个第一批并非《C++ Programming Language》《C++ Primer》这种经典中的经典。而是说诸如《Exceptional C++》《More Exceptional C++》《Effective&More Effective C++》《C++ Gotchas》《Generic Programming and the STL》《The C++ Standard Library》《C++ Templates》《Morden C++ Design》等。其中《Modern C++ Design》是最为激动人心的著作。学泛型而不读该著作就好像学算法不读D.E的《The Art of Compute Programming vol. 1.2.3 》一样,无法达到更高的境界。我只记得当时拿到这本书从早晨9点一直看到晚上22点,两顿饭都没有吃,如痴如醉。正因为这本书太经典,也太前卫了,所以我看完心里就暗暗的下了个结论“C++图书界将很久不会出现这样激动人心的著作了”。果然,后来出的一些如《Accelerate C++》《Applied C++》《C++ Network Programming vol.1.2》等,虽然也堪入经典之列,但是毕竟没有令人十分振奋的内容了。

然而,C++泛型技术的发展却一刻也没有停止过,boost库的不断更新将C++泛型技术逐渐推动到了一个新的高峰,原先在《Modern C++ Design》中的有些前卫有些学院派的技术到了boost库中终于和实践紧密结合到了一起,泛型的抽象本质发挥了其惊人的力量,于是boost库里出现了一个又一个具有高度可复用性和定制性的泛型构件。泛型通过boost库终于渐渐贴近了程序员的生活。

如果说C++泛型是那只压在五行山下的孙猴子,那么《Modern C++ Design》就揭开了山上的封印,释放了这猴头惊人的力量,而boost库则是孙悟空头上的那道金箍,约束并引导着它向正确的方向走,做正确的事。虽然有这道金箍,但它的力量却一点也没有削弱,甚至更强,只不过在被磨掉棱角的同时日趋成熟了而已。

然而,遗憾的是,虽然boost库中随处可见精致的泛型应用,可以说是一本源码教科书,正如Linux源代码之与程序员,但是“没有三两三,别想过梁山”,并非每个人都能够读懂其源代码,甚至一个对泛型颇为了解的程序员也会在其中迷途难返。这是因为boost库为了在大部分主流编译器上都能通过编译,做了很多的workaround,并且,为了节省代码量,boost库中随处可见大片大片的宏,这些宏就像迷宫,源代码的迷宫。这两个原因都使得boost的源代码可读性较差。

因此,boost库虽然贴近了程序员,boost库的源代码却愈发远离了程序员。

但是,在C++泛型领域已经登堂入室,欲更进一步,一窥堂奥者却非得阅读像boost这样经典的源代码不可。“熟读唐诗三百首,不会吟诗也会吟”。

虽然boost库的源代码的可读性较差,但也并非极差,如果有人事先为你透彻讲解boost库中的泛型运用和设计理念,相信你一定会在阅读时游刃有余。

这就是了——一本即将出版的经典之作,由boost的发起者之一,C++标准委员会的成员David Abraham以及另一位boost成员Aleksey Gurtovoy合著的——《C++ Template Metaprogramming:Concepts,Tools,and Techniques from Boost and Beyond》。

对于这么一本势必成为经典的书,我实在惶于评价,还是引用其主页上面的一段话吧:

 

这本讲述C++模板元编程的书将赋予C++用户空前的强大能力,并使这门技术成为程序员手中真正实用的一门技术。

    This book covers C++ Template Metaprogramming in a way that provides unprecedented capability to the C++ power-user, and delivers practical metaprogramming into the hands of the everyday programmer.

 

一直以来,C++泛型似乎总处于一种奇怪的位置,有人说它太学院派,有人认为那太遥远,现在还用不到它,有人认为那是库的设计者的事情,与程序员关系不大。更有人持“不敢高攀”的态度。其实这些都是错误的态度,泛型是一门由来已久的思想,其核心理念是抽象,并没有什么神秘之处。与面向对象提供的二进制复用相比,泛型的代码提供了源码级的复用,一个具有更强的动态特性,一个具有更强的类型安全性和效率,两者互补才能发挥最大的力量。已经出版的很多关于C++泛型的经典书籍其实已经很好的介绍了这一点。只不过,关于C++泛型,还有一门可以独立出来的技术——模板元编程。而这恰恰是令泛型构件更具表达力和自由度的技术。甚至也可以说是boost库的基石之一(除了部分对泛型依赖不强的组件如Regex等例外)。所以,显而易见这是一门非常重要的技术,这一点从《Generative Programming》一书中也可看出。

然而,对于这门可以独立出来的技术,目前我们所看到的只是一些零星的描述,《C++ Templates》里面虽有一整章描述metaprogram,但对于渴求知识者仍如隔靴搔痒,不能尽兴。不过,这种情况就快过去了,《C++ Template Metaprogramming》将会系统的讲述C++模板元编程技术,将这门原先只是大师们手中的利器的神秘技术带到普通程序员的手中,赋予普通程序员惊人的力量。

如果说《Modern C++ Design》是C++泛型书籍上的经典之作(它的确是),那么这本即将道来的《C++ Template Metaprogramming》将是经典之后的又一次经典!

 

作者开放了该书的第三章和附录A。虽然只有两章,但是精彩纷呈,绝对值得一读。下面是我的翻译,一是出于自己的兴趣,二是方便读者。

 

第三章 深度探索元函数

http://blog.csdn.net/pongba/archive/2004/09/01/90642.aspx

发表于 2004年09月01日 6:21 AM


评论

#  回复:经典之后的经典 2004-09-01 8:30 AM 赵忠祥老师
永远支持c++

#  回复:经典之后的经典 2004-09-01 8:30 AM 赵忠祥老师
永远支持c++

#  回复:经典之后的经典 2004-09-01 8:54 AM firingme
“熟读唐诗三百首,不会吟诗也会吟” ??? 两个“吟”??呵呵……

另外,“除了部分对泛型依赖不强的组件如Regex等例外”这句话很快也要随着Eric的xpressive正则表达式库的推出而成为历史了。xpressive从Spirit身上看到了ET和TMP结合所产生的巨大威力,从而操刀重新又写了一个正则表达式库。

Spirit的作者Joel de Guzman和Dave Abrahams都曾经反复强调,现代C++编程技术的核心目标就是为各种不同的Domain Problem提供威力强大的Domain Language——主要就是利用ET,TMP以及……嗯,没错,还有MACRO。Spirit已经在lex和parse两个领域充分展现了C++的强大,即将进入Boost的FSM库在状态机领域体现了C++的威力,相信接踵而来的各式各样的Boost Library一定会给我们带来越来越多的惊喜。



#  回复:经典之后的经典 2004-09-01 4:58 PM 刘未鹏
to firingme:
是啊,C++,永远的追求...
Boost,无穷的惊喜...

BTW. “不会吟诗也会吟”好象是《唐诗三百首》的序里面的原话,这个俗语的版本非常多"不会作诗也会吟”也是其一。^_^
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的图书管理系统的C++代码示例: ```c++ #include <iostream> #include <vector> #include <string> using namespace std; // 图书类 class Book { public: Book(string name, string author, string publisher, int year, double price) { this->name = name; this->author = author; this->publisher = publisher; this->year = year; this->price = price; } string getName() { return name; } string getAuthor() { return author; } string getPublisher() { return publisher; } int getYear() { return year; } double getPrice() { return price; } private: string name; // 书名 string author; // 作者 string publisher; // 出版社 int year; // 出版年份 double price; // 价格 }; // 图书馆类 class Library { public: void addBook(Book book) { books.push_back(book); cout << "添加图书成功!" << endl; } void removeBook(string name) { for (int i = 0; i < books.size(); i++) { if (books[i].getName() == name) { books.erase(books.begin() + i); cout << "删除图书成功!" << endl; return; } } cout << "没有找到要删除的图书!" << endl; } void displayAllBooks() { cout << "图书馆一共有" << books.size() << "本图书:" << endl; for (int i = 0; i < books.size(); i++) { cout << "书名:" << books[i].getName() << ",作者:" << books[i].getAuthor() << ",出版社:" << books[i].getPublisher() << ",出版年份:" << books[i].getYear() << ",价格:" << books[i].getPrice() << endl; } } private: vector<Book> books; // 图书集合 }; // 主函数 int main() { Library library; // 创建一个图书馆对象 // 添加图书 Book book1("C++ Primer", "Stanley B. Lippman", "人民邮电出版社", 2013, 98.0); library.addBook(book1); Book book2("Effective C++", "Scott Meyers", "机械工业出版社", 2005, 49.0); library.addBook(book2); // 显示所有图书 library.displayAllBooks(); // 删除图书 library.removeBook("Effective C++"); // 再次显示所有图书 library.displayAllBooks(); return 0; } ``` 上面这个代码实现了一个简单的图书管理系统,可以添加图书、删除图书和显示所有图书。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值