Modern C++ Design - Andrei Alexandrescu 读书笔记
基本信息
- 书名: Modern C++ Design: Generic Programming and Design Patterns Applied
- 作者: Andrei Alexandrescu
- 出版社: Addison Wesley, 2001
- 页数: 285页
- 文件: /books/c++/Modern_Cpp_Design.pdf (1.92MB)
核心贡献
本书开创性地将泛型编程与设计模式结合,提出了”Generic Component”的概念——可复用的设计模板,编译器自动生成代码。配套开源库 Loki 提供了完整实现。
全书结构
Part I: Techniques (技术基础)
Chapter 1: Policy-Based Class Design
- 核心理念:将类的多个独立维度分解为独立的 Policy 类
- 示例:SmartPtr 的 Storage Policy、Thread Safety Policy、Deletion Policy
- 优势:组合式扩展,无需继承 hierarchy
- 关键模式:
Policy<T1, T2, ...>组合
Chapter 2: Template Techniques
- Compile-Time Assertions:
STATIC_CHECK(condition) - Partial Template Specialization
- Type Traits: 编译期类型查询与转换
- NullType / EmptyType: 终止递归的基类型
Chapter 3: Typelists
- 定义:
typedef TypeList<int, float> MyTypes; - 操作:Length、Get、Append、Erase、Replace
- 应用:多方法分发、策略组合
- 关键宏:
TYPELIST_1(T1),TYPELIST_2(T1,T2), …,TYPELIST_10
Chapter 4: Small-Object Allocation
- 问题:小对象分配效率低(malloc/free 开销大)
- 方案:Chunk-based 内存池
- Fixed-Size Allocator: 按大小分组管理
- 实现:
SmallObjAllocator类
Part II: Components (泛型组件)
Chapter 5: Generalized Functors
- Command Pattern 的泛型实现
Functor<R, ParamList>模板- 支持:普通函数、成员函数、bind、链式调用
- Undo/Redo 支持
Chapter 6: Implementing Singletons
- 经典问题:Dead Reference Problem(静态对象析构顺序)
- 方案1: Phoenix Singleton(延迟初始化)
- 方案2: Singleton with Longevity(生命周期管理)
- 线程安全:ThreadingModel Policy
- 实现:
SingletonHolder<T>模板
Chapter 7: Smart Pointers
SmartPtr<T>模板,支持多种 Ownership Policy- Storage Policies: reference counting, explicit unsharing
- 成员函数:operator*, operator->, get(), reset()
- 线程安全:ObjectLevelLockable / ClassLevelLockable
Chapter 8: Object Factories
- 问题:如何创建未知类型的对象?
- 方案:注册模式 + 模板元编程
Factory<Base, ArgTypes>模板- 支持:Clone Factory(原型模式)
Chapter 9: Abstract Factory
- 泛型抽象工厂接口
AbstractFactory<Product>模板- 具体实现:
ConcreteFactory<Product, Creator>
Chapter 10: Visitor
- 标准 Visitor 的问题:修改类层次结构
- Acyclic Visitor:基于 Typelist 的分发
Visitor模板 +Visitable模板- 支持:双向访问、Hook 机制
Chapter 11: Multimethods
- 问题:C++ 只支持单分派(virtual 函数)
- 双分派:
Dispatcher<BaseLhs, BaseRhs> - 三种实现:
StaticDispatcher: 编译期,最高效BasicDispatcher: 运行时,对数时间BasicFastDispatcher: 运行时,常数时间
- FnDispatcher / FunctorDispatcher: 高级层
Appendix A: Multithreading Library
- ThreadingModel Policy
- 三种实现:SingleThreaded, ObjectLevelLockable, ClassLevelLockable
- 原子操作:AtomicAdd, AtomicSubtract, etc.
- Lock RAII 模式
关键概念总结
| 概念 | 用途 | 示例 |
|---|---|---|
| Policy-Based Design | 解耦多维度特性 | SmartPtr<RefCnt, ThreadSafe> |
| Typelist | 编译期类型序列 | TYPELIST_3(int, float, double) |
| Type Traits | 编译期类型查询 | IsPointer |
| Functors | 可调用对象封装 | Functor<void, TYPELIST_2(int,int)> |
| SingletonHolder | 线程安全单例 | SingletonHolder |
| Multimethod | 双分派分发 | StaticDispatcher<Painter, Shape> |
Loki 库
配套开源库,提供:
- 所有上述泛型组件的实现
- 线程安全基础框架
- 可用于任何 C++ 项目
官网: http://www.lokigui.com/ (原 awl.com 链接已失效)
与其他知识关联
- Effective C++: Scott Meyers 的风格指南,可与本工具书互补
- 《STL源码剖析》: Josuttis 的经典,深入理解标准库实现
- 《C++ Primer》: 基础教材,建议先学再读本书
- SICP: 计算理论奠基,理解泛型编程思想有助于读懂本书
- 设计模式:可复用面向对象软件的基础(GoF): 设计模式圣经,本书是其泛型实现
行动点
- 研究 Loki 库源码,理解现代 C++ 设计实践
- 实践 Policy-Based Design,重构现有代码
- 深入理解 Typelist 的元编程技巧
- 参考本书思想,设计自己的泛型组件库
评价
经典之作。将设计模式从”手写代码”提升到”泛型自动化”层次,影响深远。现代 C++ (C++11/14/17) 的许多特性(如 std::function, std::unique_ptr, std::shared_ptr)都能看到本书思想的影子。
适合:有一定 C++ 基础、想深入理解模板元编程和高级设计模式的开发者。