《Modern C++ Design》Loki库源码读解随想

原创 2002年07月23日 10:52:00

Modern C++ DesignLoki库源码读解随想

大牛Andrei Alexandrescu的《Modern C++ Design》讨论的是C++语言的最前沿研究:generative programming。本书中译版估计得要半年以后才能出来,所以只能靠其所附源码来窥测generative programming了。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

目前,我刚将源码读解了约一半,等全部读完,我会将我的读解注释放出来的。现在,现谈一下我的感想。

    先扯得远一点。C++有两个巨大优点:和C兼容,自由;有两个巨大缺点:和C兼容,复杂。C++极其复杂,很难掌握,而这正是“自由”的代价。C++语言是个多编程风格的语言,它同时支持过程化、基于对象、面向对象、泛型、生成性5种编程思想,具有极其强大的表达能力,可以方便地将各种设计转化为实现。

generic Programming的思想精髓是基于接口编程(相对于OOP,连多态所需的基类都不要了),它的技术出发点是选择子,核心技术是:类型推导、类型萃取、特化/偏特化,其成果是STL库:一组通用容器和一组操作于通用容器上的通用算法。

generative programming的思想精髓是基于策略编程(编译器根据策略自动生成所需代码,由于具有更高的抽象性,所以代码复用度也更高),在Loki库的实现中,目前只使用了递归策略,它的技术出发点是Typelist,核心技术是:类型推导、类型萃取、特化/偏特化、多重继承、类型间去耦合,其成果是Loki库:对设计模式的封装。

Typelist是一种对类型本身进行存储和管理的技巧,它的源码已经贴过了,我也作了注解,此处不再谈论。

这是多重继承COM之后的又一大型运用。多重继承极易发生菱型缺陷,所以Loki库使用了类型间去耦合技术来避免:

    template <typename T>

    struct Type2Type

    {

        typedef T OriginalType;

    };

经过这样一层转换后,原类型T间的各种转换关系(尤其是继承/派生关系)已不复存在,菱型缺陷不会再发生了。

Loki库的具体实现相当讲究技巧,设计它非常困难(难度远大于STL库,和Boost库有得一拼啊)。但使用它却非常容易,而且便利显著。由于Loki库提供了对设计模式的封装,所以极大量地丰富了C++语言的表达能力,使的你的设计更容易地转化为实现。

目前,Loki库只提供了对厂模式和visitor模式的封装,它还处于发展初期。

我以visitor模式为例,讲解Loki库提供的便利。

Visitor模式有四种实现方式:1一串RTTI的类型判断;2二次调度(double dispatch);3建立类型与处理函数的对应表;4非循环visitor(Acyclic Visitor)。在《More Effective C++》 Item 31中讨论了前3种实现(虽然它的例子本身不太算visitor模式的)。第四种方式在《使用设计模式改善程序结构》(二)(http://www-900.ibm.com/developerWorks/cn/java/l-dpstruct/part2/index.shtml)中有详细讲解。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

原型图

以这张原型图而言,用户需要自己实现大量的代码,而且,由于使用多重继承技术,在具体Host类间有继承关系时,它一定会发生问题。

 Loki库实现图

 

使用Loki库,用户实现visitor模式时只需:让Host类从BaseVisitable继承,并在所有派生类中加上DEFINE_VISITABLE()宏,让所有Visitor类从BaseVisitor类和VisitorImpl类进行二重继承(并且可以只提供对自己感兴趣的Host类的处理函数,不感兴趣的不提供处理函数)。用户的工作量非常小、非常简单,设计人员可以不用为实现而分心了。

更重要的是,由于采用了类型间去耦合技术,多个Host之间存在继承关系时,不会发生问题(其具体实现较复杂,于是我在UML图上作了模糊处理,没有展示出来,留在以后Loki库源码读解时讲述)。

Loki库使用(1)

C++设计模式类库 Loki介绍与用法 Loki是由Andrei编写的一个与《Modern C++ Design》(C++设计新思维)一书配套发行的C++代码库。 它不仅把C++模板的功能...
  • chollima
  • chollima
  • 2012年11月07日 16:44
  • 34456

C++三大库boost、loki、stlport

转: STL是一个标准,各商家根据这个标准开发了各自的STL版本。而在这形形色色的STL版本中,SGI STL无疑是最引人瞩目的一个。这当然是因为这个STL产品系出名门,其设计和编写者名单中,Ale...
  • zww0815
  • zww0815
  • 2016年04月28日 16:14
  • 1960

C++设计模式类库Loki介绍

Loki是由Andrei编写的一个与《Modern C++ Design》(C++设计新思维)一书配套发行的C++代码库。它不仅把C++模板的功能发挥到了极致,而且把类似设计模式这样思想层面的东西通过...
  • ACHelloWorld
  • ACHelloWorld
  • 2015年03月04日 13:47
  • 609

【设计模式】--C++设计模式类库 Loki介绍与用法

http://www.usidcbbs.com/simple/?t2428.html http://book.douban.com/subject/1119904/ C++设计模式类库 Lok...
  • Witch_Soya
  • Witch_Soya
  • 2012年05月29日 14:11
  • 3305

Modern C++ Design(中英文版及源码)(C++设计新思维:泛型编程与设计模式之应用)

  • 2014年07月20日 17:23
  • 16.41MB
  • 下载

Modern C++ Design中英文版chm+pdf+pdg

  • 2008年11月29日 13:10
  • 15.81MB
  • 下载

Modern C++ Design 读书笔记一

一直以来都以为自已对于c++是很熟悉的,但是最近在看《Modern C++ Design》(中文名:C++设计新思维--范型编程与设计模式之应用)这本书时才发现自已对于C++实在是了解的太少了。 用法...
  • BlueDog
  • BlueDog
  • 2009年05月22日 19:23
  • 3406

Modern C++ design 第五章

本章介绍泛化仿函数,是一种可以将C++所允许的任何处理请求封装起来, 并可以获得“型别安全性质”的高级对象。 特性:可封装任何处理请求,比如函数指针,成员函数指针,仿函数, 其它泛化仿函数,并连同参数...
  • dummyedu
  • dummyedu
  • 2007年01月17日 14:58
  • 1699

《Modern C++ Design》摘要

1. 你無法特化結構。單單使用templates,你無法特化「class 的結構」(我的意思是其資料成員),你只能特化其成員函式。2. 成員函式的特化並不能「依理擴張」。你可以對「單㆒template...
  • jia_xiaoxin
  • jia_xiaoxin
  • 2008年09月24日 17:16
  • 640

Modern C++ Design

  • 2010年09月21日 12:16
  • 1.92MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Modern C++ Design》Loki库源码读解随想
举报原因:
原因补充:

(最多只允许输入30个字)