## 泛 型編程與模板元編程
### 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 總結