就像<<Ruminations on C++>>一样,<<Modern C++ Design>>关注的首先是Design,它明确的将这种设计命名为了“基于Policy的编程”,而不再用“模块化”、“封装变化”等泛泛的术语;其次是C++,核心是TypeList;如果<<Ruminations on C++>>是C++初创的十几年中Classic C++的设计指南的话,类似TypeList的思想则可能是最近几年和未来几年Modern C++的设计指南
1,policy
关键是将class分解为一组正交的行为;正确的分解出来之后,它叫policy也好,依赖注入也好,静态也好,动态也好,都无所谓,只需用手边的语言或工具将它们组织起来即可,良好的设计不依赖于它的名字,基于policy的编程和依赖注入基本是一回事,关键是你基于哪些policy,你注入啥
2,编译器:被忽略的计算机
编译器对代码所做的检查,即是编译器的接口,是很重要和有用的计算能力,所有编译期技术皆依赖于此;这些可利用的计算能力实际上包括所有C++语法规则: 类型系统、大小不能为0的数组、用到的类或函数必须有定义、sizeof()、模板实例化,等等
3,局部类
可用于在针对接口编程的系统中隐藏实现
4,Int2Type, Type2Type, TypeSelection....
额外的中间层
5,typelist
简直就是LISP,最简单却又最具表达力,一切拜抽象、递归所赐
template<T, U> struct TypeList{
typedef T Head;
typedef U Tail;
}
6,Command Pattern 与 Functional Programming
在非FP的编程语言中进行FP风格的编程时,关键的一点是状态和时序;Command对象封装了状态,也封装了真正eval的时机,使Command对象的客户可以进行FP风格的编程
7,仿函数与函数指针
有基本兼容的语法和语义,区别之一是当存在重载函数时,函数指针有歧义,此时可通过赋值或转型来选出感兴趣的那个重载函数
8,GP 与 OO
在泛型程序设计中,template实参对其相应形参的语法替换是很典型的情况;template的处理发生在编译之前,这让你得以在源码层级有所动作;OO与此并无不同,它的威力来自于“名称(name)”与“实值(value)”的后期(编译后)绑定;因此,OOP支持二进制组件形式的复用,GP支持源码层级的复用;与二进制码相比较,源码天生具有更多信息和更高级别,所以泛型编程支持更丰富的构件,但其代价是较弱的执行期动态性;你无法通过STL完成CORBA所能完成的功能,反之亦然,两种技术相互补充