译者序
前言
第一部分 基本工具
第1章 元组
1.1 头文件的摘要
1.2 tuple类模板
1.3 像tuple一样对std::pair进行存取
1.4 练习
第2章 智能指针
2.1 定义
2.2 关于示例
2.3 头文件的摘要
2.4 shared_ptr类模板
2.5 类模板weak_ptr
2.6 类模板enable_shared_from_this
2.7 bad_weak_ptr类
2.8 转换
2.9 受控资源的析构
2.10 异常
2.11 多线程
2.12 练习
第二部分 容器
第3章 基础知识
3.1 STL部件
3.2 容器
3.3 进一步阅读
3.4 练习
第4章 类模板array
4.1 类模板array概述
4.2 信息获取
4.3 访问
4.4 修改
4.5 迭代
4.6 内嵌类型名称
4.7 比较
4.8 与tuple类似的接口
4.9 练习
第5章 无序关系容器
5.1 对散列表进行标准化
5.2 散列表
5.3 关系容器和无序容器
5.4 对无序容器的要求
5.5 头文件和
5.6 类模板hash
5.7 无序容器的实例化
5.8 构造函数
5.9 容器操作
5.10 负载因子和重散列
5.11 优化
5.12 进一步阅读
5.13 练习
第三部分 调用包装器
第6章 调用包装器基础
6.1 术语
6.2 对可调用类型的要求
6.3 头文件的摘要
6.4 类模板result_of
6.5 与现存的函数对象进行交互
6.6 练习
第7章 mem_fn函数模板
第8章 reference_wrapper类模板
8.1 创建
8.2 内嵌类型
8.3 调用
8.4 练习
第9章 类模板function
9.1 构造一个function对象
9.2 访问
9.3 修改
9.4 比较
9.5 内嵌类型
9.6 调用
9.7 目标对象
9.8 练习
第10章 函数模板bind
10.1 占位符
10.2 unspecified bind(…)
10.3 对bind进行扩展
10.4 练习
第四部分 类型特性
第11章 类型特性概述
11.1 头文件
11.2 辅助类型
11.3 基本类型
11.4 复合类型
11.5 类型属性
11.6 类型关系
11.7 类型变换
11.8 对齐
11.9 进一步阅读
11.10 练习
第五部分 数值
第12章 数值函数
12.1 关于示例
12.2 浮点值的表示
12.3 管理浮点环境
12.4 无穷大、非规范数、NaN和比较
12.5 定义域和值域错误
12.6 新的重载规则
12.7 基本数学函数
12.8 数学特殊函数
12.9 复函数
12.10 进一步阅读
12.11 练习
第13章 随机数生成器
13.1 随机数引擎
13.2 TR1中的引擎模板
13.3 TR1库中的random_device类
13.4 TR1库中的预定义引擎
13.5 随机数分布
13.6 离散分布
13.7 连续分布
13.8 类模板variate_generator
13.9 进一步阅读
13.10 练习
第六部分 正则表达式
第14章 头文件
第15章 正则表达式语法
15.1 正则表达式结构
15.2 语法特性
15.3 正则表达式细节
15.4 关于练习
15.5 练习
第16章 正则表达式对象
16.1 定义
16.2 头文件的部分摘要
16.3 语法选项
16.4 basic_regex类模板
16.5 预定义的basic_regex类型
16.6 错误处理
16.7 练习
第17章 查找
17.1 头文件的部分摘要
17.2 完整匹配
17.3 查找
17.4 查找选项
17.5 练习
第18章 查找结果
18.1 头文件的部分摘要
18.2 sub_match类模板
18.3 预定义的sub_match类型
18.4 类模板match_results
18.5 练习
第19章 重复查找
19.1 暴力查找
19.2 regex_iterator类模板
19.3 regex_token_iterator类模板
19.4 练习
第20章 格式化和文本替换
20.1 格式化选项
20.2 格式化文本
20.3 文本替换
20.4 练习
第21章 正则表达式的定制
21.1 字符特性
21.2 locale
21.3 字符匹配
21.4 归并
21.5 字符类别
21.6 regex_traits类模板
第七部分 C语言兼容
第22章 C语言兼容
22.1 整数类型
22.2 64位整数类型
22.3 固定大小的整数类型
22.4 文本转换
22.5 格式化说明符
22.6 格式化I/O
22.7 字符分类
22.8 布尔类型
22.9 练习
附录
附录A 头文件
附录B 辅助头文件
附录C 多线程
参考文献
//z 2014-05-31 20:51:25 L.214'11315 BG57IV3@BYH T568499618 .K.F519279140 [T7,L115,R1,V13]
《深入理解c++11:c++11新特性解析与应用》
免责声明
序
前言
第1章 新标准的诞生 1
1.1 曙光:c++11标准的诞生 1
1.1.1 c++11/c++0x(以及c11/c1x)—新标准诞生 1
1.1.2 什么是c++11/c++0x 2
1.1.3 新c++语言的设计目标 3
1.2 今时今日的c++ 5
1.2.1 c++的江湖地位 5
1.2.2 c++11语言变化的领域 5
1.3 c++11特性的分类 7
1.4 c++特性一览 11
1.4.1 稳定性与兼容性之间的抉择 11
1.4.2 更倾向于使用库而不是扩展语言来实现特性 12
1.4.3 更倾向于通用的而不是特殊的手段来实现特性 13
1.4.4 专家新手一概支持 13
1.4.5 增强类型的安全性 14
1.4.6 与硬件紧密合作 14
1.4.7 开发能够改变人们思维方式的特性 15
1.4.8 融入编程现实 16
1.5 本书的约定 17
1.5.1 关于一些术语的翻译 17
1.5.2 关于代码中的注释 17
1.5.3 关于本书中的代码示例与实验平台 18
第2章 保证稳定性和兼容性 19
2.1 保持与c99兼容 19
2.1.1 预定义宏 19
2.1.2 __func__预定义标识符 20
2.1.3 _pragma操作符 22
2.1.4 变长参数的宏定义以及__va_args__ 22
2.1.5 宽窄字符串的连接 23
2.2 long long整型 23
2.3 扩展的整型 25
2.4 宏__cplusplus 26
2.5 静态断言 27
2.5.1 断言:运行时与预处理时 27
2.5.2 静态断言与static_assert 28
2.6 noexcept修饰符与noexcept操作符 32
2.7 快速初始化成员变量 36
2.8 非静态成员的sizeof 39
2.9 扩展的friend语法 40
2.10 final/override控制 44
2.11 模板函数的默认模板参数 48
2.12 外部模板 50
2.12.1 为什么需要外部模板 50
2.12.2 显式的实例化与外部模板的声明 52
2.13 局部和匿名类型作模板实参 54
2.14 本章小结 55
第3章 通用为本,专用为末 57
3.1 继承构造函数 57
3.2 委派构造函数 62
3.3 右值引用:移动语义和完美转发 68
3.3.1 指针成员与拷贝构造 68
3.3.2 移动语义 69
3.3.3 左值、右值与右值引用 75
3.3.4 std::move:强制转化为右值 80
3.3.5 移动语义的一些其他问题 82
3.3.6 完美转发 85
3.4 显式转换操作符 89
3.5 列表初始化 92
3.5.1 初始化列表 92
3.5.2 防止类型收窄 96
3.6 pod类型 98
3.7 非受限联合体 106
3.8 用户自定义字面量 110
3.9 内联名字空间 113
3.10 模板的别名 118
3.11 一般化的sfinea规则 119
3.12 本章小结 121
第4章 新手易学,老兵易用 123
4.1 右尖括号]的改进 123
4.2 auto类型推导 124
4.2.1 静态类型、动态类型与类型推导 124
4.2.2 auto的优势 126
4.2.3 auto的使用细则 130
4.3 decltype 134
4.3.1 typeid与decltype 134
4.3.2 decltype的应用 136
4.3.3 decltype推导四规则 140
4.3.4 cv限制符的继承与冗余的符号 143
4.4 追踪返回类型 145
4.4.1 追踪返回类型的引入 145
4.4.2 使用追踪返回类型的函数 146
4.5 基于范围的for循环 150
4.6 本章小结 153
第5章 提高类型安全 155
5.1 强类型枚举 155
5.1.1 枚举:分门别类与数值的名字 155
5.1.2 有缺陷的枚举类型 156
5.1.3 强类型枚举以及c++11对原有枚举类型的扩展 160
5.2 堆内存管理:智能指针与垃圾回收 163
5.2.1 显式内存管理 163
5.2.2 c++11的智能指针 164
5.2.3 垃圾回收的分类 167
5.2.4 c++与垃圾回收 169
5.2.5 c++11与最小垃圾回收支持 170
5.2.6 垃圾回收的兼容性 172
5.3 本章小结 173
第6章 提高性能及操作硬件的能力 174
6.1 常量表达式 174
6.1.1 运行时常量性与编译时常量性 174
6.1.2 常量表达式函数 176
6.1.3 常量表达式值 178
6.1.4 常量表达式的其他应用 180
6.2 变长模板 183
6.2.1 变长函数和变长的模板参数 183
6.2.2 变长模板:模板参数包和函数参数包 185
6.2.3 变长模板:进阶 189
6.3 原子类型与原子操作 196
6.3.1 并行编程、多线程与c++11 196
6.3.2 原子操作与c++11原子类型 197
6.3.3 内存模型,顺序一致性与memory_order 203
6.4 线程局部存储 214
6.5 快速退出:quick_exit与at_quick_exit 216
6.6 本章小结 219
第7章 为改变思考方式而改变 220
7.1 指针空值—nullptr 220
7.1.1 指针空值:从0到null,再到nullptr 220
7.1.2 nullptr和nullptr_t 223
7.1.3 一些关于nullptr规则的讨论 225
7.2 默认函数的控制 227
7.2.1 类与默认函数 227
7.2.2 “= default”与“= deleted” 230
7.3 lambda函数 234
7.3.1 lambda的一些历史 234
7.3.2 c++11中的lambda函数 235
7.3.3 lambda与仿函数 238
7.3.4 lambda的基础使用 240
7.3.5 关于lambda的一些问题及有趣的实验 243
7.3.6 lambda与stl 247
7.3.7 更多的一些关于lambda的讨论 254
7.4 本章小结 256
第8章 融入实际应用 258
8.1 对齐支持 258
8.1.1 数据对齐 258
8.1.2 c++11的alignof和alignas 261
8.2 通用属性 267
8.2.1 语言扩展到通用属性 267
8.2.2 c++11的通用属性 268
8.2.3 预定义的通用属性 270
8.3 unicode支持 274
8.3.1 字符集、编码和unicode 274
8.3.2 c++11中的unicode支持 276
8.3.3 关于unicode的库支持 280
8.4 原生字符串字面量 284
8.5 本章小结 286
附录a c++11对其他标准的不兼容项目 287
附录b 弃用的特性 294
附录c 编译器支持 301
附录d 相关资源 304
1.4.8 融入编程现实 16
1.5 本书的约定 17
1.5.1 关于一些术语的翻译 17
1.5.2 关于代码中的注释 17
1.5.3 关于本书中的代码示例与实验平台 18
第2章 保证稳定性和兼容性 19
2.1 保持与c99兼容 19
2.1.1 预定义宏 19
2.1.2 __func__预定义标识符 20
2.1.3 _pragma操作符 22
2.1.4 变长参数的宏定义以及__va_args__ 22
2.1.5 宽窄字符串的连接 23
2.2 long long整型 23
2.3 扩展的整型 25
2.4 宏__cplusplus 26
2.5 静态断言 27
2.5.1 断言:运行时与预处理时 27
2.5.2 静态断言与static_assert 28
2.6 noexcept修饰符与noexcept操作符 32
2.7 快速初始化成员变量 36
2.8 非静态成员的sizeof 39
2.9 扩展的friend语法 40
2.10 final/override控制 44
2.11 模板函数的默认模板参数 48
2.12 外部模板 50
2.12.1 为什么需要外部模板 50
2.12.2 显式的实例化与外部模板的声明 52
2.13 局部和匿名类型作模板实参 54
2.14 本章小结 55
第3章 通用为本,专用为末 57
3.1 继承构造函数 57
3.2 委派构造函数 62
3.3 右值引用:移动语义和完美转发 68
3.3.1 指针成员与拷贝构造 68
3.3.2 移动语义 69
3.3.3 左值、右值与右值引用 75
3.3.4 std::move:强制转化为右值 80
3.3.5 移动语义的一些其他问题 82
3.3.6 完美转发 85
3.4 显式转换操作符 89
3.5 列表初始化 92
3.5.1 初始化列表 92
3.5.2 防止类型收窄 96
3.6 pod类型 98
3.7 非受限联合体 106
3.8 用户自定义字面量 110
3.9 内联名字空间 113
3.10 模板的别名 118
3.11 一般化的sfinea规则 119
3.12 本章小结 121
第4章 新手易学,老兵易用 123
4.1 右尖括号]的改进 123
4.2 auto类型推导 124
4.2.1 静态类型、动态类型与类型推导 124
4.2.2 auto的优势 126
4.2.3 auto的使用细则 130
4.3 decltype 134
4.3.1 typeid与decltype 134
4.3.2 decltype的应用 136
4.3.3 decltype推导四规则 140
4.3.4 cv限制符的继承与冗余的符号 143
4.4 追踪返回类型 145
4.4.1 追踪返回类型的引入 145
4.4.2 使用追踪返回类型的函数 146
4.5 基于范围的for循环 150
4.6 本章小结 153
第5章 提高类型安全 155
5.1 强类型枚举 155
5.1.1 枚举:分门别类与数值的名字 155
5.1.2 有缺陷的枚举类型 156
5.1.3 强类型枚举以及c++11对原有枚举类型的扩展 160
5.2 堆内存管理:智能指针与垃圾回收 163
5.2.1 显式内存管理 163
5.2.2 c++11的智能指针 164
5.2.3 垃圾回收的分类 167
5.2.4 c++与垃圾回收 169
5.2.5 c++11与最小垃圾回收支持 170
5.2.6 垃圾回收的兼容性 172
5.3 本章小结 173
第6章 提高性能及操作硬件的能力 174
6.1 常量表达式 174
6.1.1 运行时常量性与编译时常量性 174
6.1.2 常量表达式函数 176
6.1.3 常量表达式值 178
6.1.4 常量表达式的其他应用 180
6.2 变长模板 183
6.2.1 变长函数和变长的模板参数 183
6.2.2 变长模板:模板参数包和函数参数包 185
6.2.3 变长模板:进阶 189
6.3 原子类型与原子操作 196
6.3.1 并行编程、多线程与c++11 196
6.3.2 原子操作与c++11原子类型 197
6.3.3 内存模型,顺序一致性与memory_order 203
6.4 线程局部存储 214
6.5 快速退出:quick_exit与at_quick_exit 216
6.6 本章小结 219
第7章 为改变思考方式而改变 220
7.1 指针空值—nullptr 220
7.1.1 指针空值:从0到null,再到nullptr 220
7.1.2 nullptr和nullptr_t 223
7.1.3 一些关于nullptr规则的讨论 225
7.2 默认函数的控制 227
7.2.1 类与默认函数 227
7.2.2 “= default”与“= deleted” 230
7.3 lambda函数 234
7.3.1 lambda的一些历史 234
7.3.2 c++11中的lambda函数 235
7.3.3 lambda与仿函数 238
7.3.4 lambda的基础使用 240
7.3.5 关于lambda的一些问题及有趣的实验 243
7.3.6 lambda与stl 247
7.3.7 更多的一些关于lambda的讨论 254
7.4 本章小结 256
第8章 融入实际应用 258
8.1 对齐支持 258
8.1.1 数据对齐 258
8.1.2 c++11的alignof和alignas 261
8.2 通用属性 267
8.2.1 语言扩展到通用属性 267
8.2.2 c++11的通用属性 268
8.2.3 预定义的通用属性 270
8.3 unicode支持 274
8.3.1 字符集、编码和unicode 274
8.3.2 c++11中的unicode支持 276
8.3.3 关于unicode的库支持 280
8.4 原生字符串字面量 284
8.5 本章小结 286
附录a c++11对其他标准的不兼容项目 287
附录b 弃用的特性 294
附录c 编译器支持 301
附录d 相关资源 304
//z 2014-05-19 22:56:49 L.226' 3791 BG57IV3@BYH T1268850545.K.F1106431554[T20,L309,R2,V317]
api design for c++
目 录
第1章 API简介 1
1.1 什么是API 1
1.1.1 契约和承包人 2
1.1.2 C 中的API 3
1.2 API设计上有什么不同 4
1.3 为什么使用API 5
1.3.1 更健壮的代码 6
1.3.2 代码复用 6
1.3.3 并行开发 8
1.4 何时应当避免使用API 9
1.5 API示例 10
1.5.1 API层次 10
1.5.2 真实示例 12
1.6 文件格式和网络协议 13
1.7 关于本书 15
第2章 特征 17
2.1 问题域建模 17
2.1.1 提供良好的抽象 17
2.1.2 关键对象的建模 19
2.2 隐藏实现细节 20
2.2.1 物理隐藏:声明与定义 20
2.2.2 逻辑隐藏:封装 22
2.2.3 隐藏成员变量 23
2.2.4 隐藏实现方法 26
2.2.5 隐藏实现类 28
2.3 最小完备性 29
2.3.1 不要过度承诺 29
2.3.2 谨慎添加虚函数 30
2.3.3 便捷API 31
2.4 易用性 33
2.4.1 可发现性 34
2.4.2 不易误用 34
2.4.3 一致性 36
2.4.4 正交 38
2.4.5 健壮的资源分配 40
2.4.6 平台独立 43
2.5 松耦合 44
2.5.1 仅通过名字耦合 45
2.5.2 降低类耦合 45
2.5.3 刻意的冗余 47
2.5.4 管理器类 48
2.5.5 回调、观察者和通知 50
2.6 稳定的、文档详细且经过测试的API 53
第3章 模式 54
3.1 Pimpl惯用法 55
3.1.1 使用Pimpl 56
3.1.2 复制语义 59
3.1.3 Pimpl与智能指针 60
3.1.4 Pimpl的优点 61
3.1.5 Pimpl的缺点 62
3.1.6 C语言的不透明指针 62
3.2 单例 64
3.2.1 在C 中实现单例 64
3.2.2 使单例线程安全 66
3.2.3 单例与依赖注入 68
3.2.4 单例与单一状态 69
3.2.5 单例与会话状态 71
3.3 工厂模式 71
3.3.1 抽象基类 72
3.3.2 工厂示例 73
3.3.3 扩展工厂示例 74
3.4 API包装器模式 76
3.4.1 代理模式 76
3.4.2 适配器模式 79
3.4.3 外观模式 81
3.5 观察者模式 83
3.5.1 MVC架构 83
3.5.2 实现观察者模式 84
3.5.3 推与拉观察者 87
第4章 设计 88
4.1 良好设计的例子 89
4.1.1 积累技术债 89
4.1.2 偿还技术债 90
4.1.3 为长期而设计 91
4.2 收集功能性需求 92
4.2.1 什么是功能性需求 93
4.2.2 功能性需求举例 94
4.2.3 维护需求 94
4.3 创建用例 95
4.3.1 开发用例 95
4.3.2 用例模板 95
4.3.3 编写高质量用例 96
4.3.4 需求与敏捷开发 98
4.4 API设计的元素 100
4.5 架构设计 102
4.5.1 架构的开发 103
4.5.2 架构的约束 104
4.5.3 识别主要抽象 105
4.5.4 创造关键对象 106
4.5.5 架构模式 109
4.5.6 架构的交流 110
4.6 类的设计 111
4.6.1 面向对象概念 112
4.6.2 类设计选项 113
4.6.3 使用继承 113
4.6.4 Liskov替换原则 115
4.6.5 开放?封闭原则 118
4.6.6 迪米特法则 119
4.6.7 类的命名 120
4.7 函数设计 121
4.7.1 函数设计选项 121
4.7.2 函数命名 122
4.7.3 函数参数 123
4.7.4 错误处理 125
第5章 风格 129
5.1 纯C API 129
5.1.1 ANSI C特性 130
5.1.2 ANSI C API的优点 132
5.1.3 使用ANSI C编写API 132
5.1.4 从C 中调用C函数 134
5.1.5 案例研究:FMOD C API 135
5.2 面向对象的C API 136
5.2.1 面向对象API的优点 136
5.2.2 面向对象API的缺点 136
5.2.3 案例研究:FMOD C API 137
5.3 基于模板的API 138
5.3.1 基于模板的API示例 138
5.3.2 模板与宏 139
5.3.3 基于模板的API的优点 140
5.3.4 基于模板的API的缺点 141
5.4 数据驱动型API 141
5.4.1 数据驱动型Web服务 142
5.4.2 数据驱动型API的优点 143
5.4.3 数据驱动API的缺点 144
5.4.4 支持可变参数列表 144
5.4.5 案例研究:FMOD数据驱动型API 147
第6章 C 用法 149
6.1 命名空间 149
6.2 构造函数和赋值 150
6.2.1 控制编译器生成的函数 152
6.2.2 定义构造函数和赋值操作符 153
6.2.3 explicit关键字 154
6.3 const正确性 155
6.3.1 方法的const正确性 155
6.3.2 参数的const正确性 157
6.3.3 返回值的const正确性 157
6.4 模板 158
6.4.1 模板术语 158
6.4.2 隐式实例化API设计 160
6.4.3 显式实例化API设计 162
6.5 操作符重载 164
6.5.1 可重载的操作符 164
6.5.2 自由操作符与成员操作符 165
6.5.3 为类添加操作符 166
6.5.4 操作符语法 168
6.5.5 转换操作符 170
6.6 函数参数 171
6.6.1 指针与引用参数 171
6.6.2 默认参数 172
6.7 避免使用#define定义常量 173
6.8 避免使用友元 175
6.9 导出符号 176
6.10 编码规范 179
第7章 性能 181
7.1 通过const引用传递输入参数 182
7.2 最小化#include依赖 184
7.2.1 避免“无所不包型”头文件 184
7.2.2 前置声明 184
7.2.3 冗余的#include警戒语句 186
7.3 声明常量 188
7.4 初始化列表 190
7.5 内存优化 192
7.6 除非需要,勿用内联 196
7.7 写时复制 198
7.8 迭代元素 202
7.8.1 迭代器 202
7.8.2 随机访问 203
7.8.3 数组引用 204
7.9 性能分析 205
7.9.1 时效性分析 205
7.9.2 基于内存的分析 207
7.9.3 多线程分析 208
第8章 版本控制 209
8.1 版本号 209
8.1.1 版本号的意义 209
8.1.2 小众的编号方案 210
8.1.3 提供API的版本信息 211
8.2 软件分支策略 213
8.2.1 分支策略 213
8.2.2 分支方针 213
8.2.3 API和并行分支 214
8.2.4 文件格式和并行发布产品 215
8.3 API的生命周期 216
8.4 兼容性级别 217
8.4.1 向后兼容性 217
8.4.2 功能兼容性 218
8.4.3 源代码兼容性 218
8.4.4 二进制兼容性 219
8.4.5 向前兼容性 221
8.5 怎样维护向后兼容性 222
8.5.1 添加功能 222
8.5.2 修改功能 223
8.5.3 弃用功能 224
8.5.4 移除功能 226
8.6 API审查 226
8.6.1 API审查的目的 226
8.6.2 API预发布审查 227
8.6.3 API预提交审查 228
第9章 文档 230
9.1 编写文档的理由 230
9.1.1 定义行为 230
9.1.2 为接口契约编写文档 232
9.1.3 告知行为的改变 233
9.1.4 文档涉及的内容 234
9.2 文档的类型 236
9.2.1 自动生成的API文档 237
9.2.2 概述文档 237
9.2.3 示例和教程 238
9.2.4 发布说明 238
9.2.5 授权信息 239
9.3 文档可用性 241
9.4 使用Doxygen 242
9.4.1 配置文件 242
9.4.2 注释风格和命令 242
9.4.3 API注释 243
9.4.4 文件注释 245
9.4.5 类注释 245
9.4.6 方法注释 246
9.4.7 枚举注释 247
9.4.8 带有文档的示例头文件 247
第10章 测试 250
10.1 编写测试的理由 250
10.2 API测试的类型 252
10.2.1 单元测试 253
10.2.2 集成测试 255
10.2.3 性能测试 257
10.3 编写良好的测试 259
10.3.1 良好测试的特征 259
10.3.2 测试对象 260
10.3.3 关注测试工作量 261
10.3.4 与QA一起工作 261
10.4 编写可测试的代码 262
10.4.1 测试驱动开发 262
10.4.2 桩对象和模拟对象 264
10.4.3 测试私有代码 267
10.4.4 使用断言 269
10.4.5 契约编程 270
10.4.6 记录并重放功能 272
10.4.7 支持国际化 273
10.5 自动化测试工具 273
10.5.1 自动化测试框架 274
10.5.2 代码覆盖率 277
10.5.3 缺陷跟踪系统 279
10.5.4 持续构建系统 280
第11章 脚本化 282
11.1 添加脚本绑定 282
11.1.1 扩充或嵌入 282
11.1.2 脚本化的优点 283
11.1.3 语言兼容性问题 284
11.1.4 跨越语言障碍 285
11.2 脚本绑定技术 286
11.2.1 Boost Python 286
11.2.2 SWIG 286
11.2.3 Python-SIP 287
11.2.4 自动化 287
11.2.5 CORBA 288
11.3 使用Boost Python添加Python绑定 289
11.3.1 构建Boost Python 290
11.3.2 使用Boost Python包装C API 290
11.3.3 构造函数 292
11.3.4 扩充Python API 293
11.3.5 C 中的继承 295
11.3.6 跨语言多态 296
11.3.7 支持迭代器 298
11.3.8 综合应用 298
11.4 使用SWIG添加Ruby绑定 300
11.4.1 使用SWIG包装C API 301
11.4.2 调整Ruby API 303
11.4.3 构造函数 304
11.4.4 扩充Ruby API 304
11.4.5 C 中的继承 305
11.4.6 跨语言多态 307
11.4.7 综合应用 307
第12章 可扩展性 310
12.1 通过插件扩展 310
12.1.1 插件模型概览 311
12.1.2 插件系统设计问题 313
12.1.3 以C 实现插件 314
12.1.4 插件API 315
12.1.5 插件示例 317
12.1.6 插件管理器 318
12.1.7 插件版本控制 321
12.2 通过继承扩展 322
12.2.1 添加功能 322
12.2.2 修改功能 323
12.2.3 继承与STL 324
12.2.4 继承与枚举 325
12.2.5 访问者模式 326
12.2.6 禁止子类化 331
12.3 通过模板扩展 332
12.3.1 基于策略的模板 332
12.3.2 奇特的递归模板模式 334
附录A 库 336
参考文献 351
索引 355