## 泛 型编程与模板元编程
### Boost.Call_traits
这个库提供了传递参数给函数的最好方法的自动演绎,依据参数的类型。例如,当传递的是如`int` 和 `double`这样的内建类型,最高效的方式是传值。对于用户自定义类型,则传送`const`引用通常更好。Call_traits为你自动选择正确的参数类型。这个库还有助于声明参数为引用,而不用冒引用到引用的风险(在C++这是非法的)。Call_traits常用于要求以最高效方式传递参数而又不知道参数类型的泛型函数,并避免引用到引用的问题。
Call_traits 的作者是 Steve Cleary, Beman Dawes, Howard Hinnant, 和 John Maddock.
### Boost.Concept_check
Concept_check提供一些类模板,用于测试特定的概念(需求的集合)。泛型(参数化的)代码要求实例化时的类型必须符合某些抽象概念,如LessThanComparable. 这个库提供了一些方法来明确地声明模板的参数化类型的特定需求。代码的用户可以获益,由于需求的文档化以及编译器可以产生错误信息以明确指出类型不符合这 些概念的地方。Boost.Concept_check提供了超过30个可用于泛型代码的概念,其中一些原型可用于校验包括所有相关概念的组件的实现。它 用于在泛型代码中声明和证明概念的需求。
Concept_check 的作者是 Jeremy Siek, 他从Alexander Stepanov and Matt Austern的前期工作中得到灵感。
### Boost.Enable_if
Enable_if允许函数模板或类模板的特化体包括/排除在一组匹配的函数或特化体之中/之外。主要的用例是包括/排除基于某些特性的特化体。例如,仅当采用一个整数类型实例化时使能一个函数模板。这个库还为SFINAE(substitution failure is not an error)提供了一个非常有用的研究机会。
Enable_if 的作者是 Jaakko Järvi, Jeremiah Willcock, 和 Andrew Lumsdaine.
### Boost.In_place_factory
In_place_factory库是一个直接构造所含对象的框架,包括用于初始化的可变参数列表。它可以消除对所含类型必须是CopyConstructible的要求,并减少了创建不必要的临时对象的需要,该临时对象仅用于提供复制所需的源对象。这个库有助于减少传送用于对象初始化的参数所需的工作量。
In_place_factory 的作者是 Fernando Cacciola.
### Boost.Mpl
Mpl是一个模板元编程库。它包含了与C++标准库十分相象的数据结构和算法,但它们是在编译期使用的。甚至有编译期的lambda表达式支持!提供编译期的操作,如产生类型或操作类型序列,在现代C++中越来越普遍,而提供这些功能的库是非常重要的工具。就我所知,还没有其它象Mpl这样的库。它填充了C++元编程世界的空白。我可以告诉你在你读本书时有一本关于Boost.Mpl的书正在创作,它就快要面世了,它就是Aleksey Gurtovoy 和 David Abrahams所著的C++ Template Metaprogramming。你应该尽快获得一本。
Mpl 的作者是 Aleksey Gurtovoy, 并有许多其它人的重要贡献。
### Boost.Property_map
Property_map是一个概念库而不是一个真正的实现。它引入了 `property_map` 概念以及`property_map`类型的一组要求,从而给出了对一个key和一个value的映射的语法和语义要求。这在需要声明必须支持的类型的泛型代码中很有用。C++数组是一个`property_map`的例子。这个库包含了Boost.Concept_check可以测试的概念的定义。
Property_map 的作者是 Jeremy Siek.
### Boost.Static_assert
进行编译期编程的一个公共的需求是提供静态断言,即编译期断言。另外,获得一致的错误提示不是必然的,由于静态断言必须会产生失败断言的信号,跨不同的编译器。Static_assert提供对名字空间、类、函数作用域的静态断言的支持。详细信息见"[Library 3](../Text/content.html#ch03): [Utility](../Text/content.html#ch03)."
Static_assert 的作者是 Dr. John Maddock.
### Boost.Type_traits
成功的泛型编程通常需要根据参数化类型进行决策或调整这些类型的属性(如cv-qualification\[2\])。Type_traits提供关于类型的编译期信息,如某个类型是否指针或引用,以及增加或去除类型基本属性。Type_traits已被加入即将发布的Library Technical Report。
> \[2\] 一个类型可以是cv-unqualified (非 `const` 或 `volatile`), const-qualified (`const`), volatile-qualified (声明为 `volatile`), or volatile-const-qualified (既 `const` 并 `volatile`); 类型的这些版本都是独特的。
Type_traits 的作者是 Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat Marcus, John Maddock, 和 Jeremy Siek, 以及其它许多人的贡献。
- 序
- 前言
- Acknowledgments
- 关于作者
- 本书的组织结构
- Boost的介绍
- 字符串及文本处理
- 数 据结构, 容器, 迭代器, 和算法
- 函数对象及高级编程
- 泛 型编程与模板元编程
- 数学及数字处理
- 输入/输出
- 杂项
- Part I: 通用库
- Library 1. Smart_ptr
- Smart_ptr库如何改进你的程序?
- 何时我们需要智能指针?
- Smart_ptr如何适应标准库?
- scoped_ptr
- scoped_array
- shared_ptr
- shared_array
- intrusive_ptr
- weak_ptr
- Smart_ptr总结
- Library 2. Conversion
- Conversion 库如何改进你的程序?
- polymorphic_cast
- polymorphic_downcast
- numeric_cast
- lexical_cast
- Conversion 总结
- Library 3. Utility
- Utility 库如何改进你的程序?
- BOOST_STATIC_ASSERT
- checked_delete
- noncopyable
- addressof
- enable_if
- Utility 总结
- Library 4. Operators
- Operators库如何改进你的程序?
- Operators
- 用法
- Operators 总结
- Library 5. Regex
- Regex库如何改进你的程序?
- Regex 如何适用于标准库?
- Regex
- 用法
- Regex 总结
- Part II: 容器及数据结构
- Library 6. Any
- Any 库如何改进你的程序?
- Any 如何适用于标准库?
- Any
- 用法
- Any 总结
- Library 7. Variant
- Variant 库如何改进你的程序?
- Variant 如何适用于标准库?
- Variant
- 用法
- Variant 总结
- Library 8. Tuple
- Tuple 库如何改进你的程序?
- Tuple 库如何适用于标准库?
- Tuple
- 用法
- Tuple 总结
- Part III: 函数对象与高级编程
- Library 9. Bind
- Bind 库如何改进你的程序?
- Bind 如何适用于标准库?
- Bind
- 用法
- Bind 总结
- Library 10. Lambda
- Lambda 库如何改进你的程序?
- Lambda 如何适用于标准库?
- Lambda
- 用法
- Lambda 总结
- Library 11. Function
- Function 库如何改进你的程序?
- Function 如何适用于标准库?
- Function
- 用 法
- Function 总结
- Library 12. Signals
- Signals 库如何改进你的程序?
- Signals 如何适用于标准库?
- Signals
- 用法
- Signals 总结