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, RemoveConst
Functors可调用对象封装Functor<void, TYPELIST_2(int,int)>
SingletonHolder线程安全单例SingletonHolder
Multimethod双分派分发StaticDispatcher<Painter, Shape>

Loki 库

配套开源库,提供:

  • 所有上述泛型组件的实现
  • 线程安全基础框架
  • 可用于任何 C++ 项目

官网: http://www.lokigui.com/ (原 awl.com 链接已失效)

与其他知识关联

行动点

  1. 研究 Loki 库源码,理解现代 C++ 设计实践
  2. 实践 Policy-Based Design,重构现有代码
  3. 深入理解 Typelist 的元编程技巧
  4. 参考本书思想,设计自己的泛型组件库

评价

经典之作。将设计模式从”手写代码”提升到”泛型自动化”层次,影响深远。现代 C++ (C++11/14/17) 的许多特性(如 std::function, std::unique_ptr, std::shared_ptr)都能看到本书思想的影子。

适合:有一定 C++ 基础、想深入理解模板元编程和高级设计模式的开发者。