## Variant 庫如何改進你的程序?
* 對用戶指定的多種類型的進行類型安全的存儲和取回
* 在標準庫容器中存儲不同類型的方法
* 變量訪問的編譯期檢查
* 高效的、基于棧的變量存儲
Variant 庫關注的是對一組限定類型的類型安全存儲及取回,即非無類的聯合。Boost.Variant 庫與 Boost.Any 有許多共同之外,但在功能上也有不同的考慮。在每天的編程中通常都會需要用到非無類的聯合(不同的類型)。保持類型安全的一個典型方法是使用抽象基類,但 這不總是可以做到的;即使可以做得,堆分配和虛擬函數\[1\]的代價也可能太高。你也可以嘗試用不安全的無類類型,如 `void*` (它會導致不幸),或者是類型安全得無限制的可變類型,如 Boost.Any. 這里我們將看到 Boost.Variant,它支持限定的可變類型,即元素來自于一組支持的類型。
> \[1\] 盡管虛擬函數在性能方面有非常合理的代價。
許多其它的編程語言支持可變類型,它們也再次被證實是值得的。在C++內建的對可變類型的支持非常有限,只有某種形式的聯合(union),而且主要是為了與C兼容而保留。Boost.Variant 通過一個類型模板 `variant` 補救了這種情形,并附隨有安全的存儲及取回值的工具。一個可變數據類型提供一個與當前值的類型無關的接口。如果你曾經用過別的可變類型,可能是僅能支持固定的一組類型。這個庫不是這樣的;你在使用 `variant` 時自己定義一組允許使用的類型,而一個程序中可以包含任意個不同的 `variant` 實例。為了取回保存在 `variant` 中的值,你要么知道當前值的真實類型,要么使用已提供的類型安全的訪問者(visitor)機制。訪問者機制使得 Variant 非常不同于其它可變類型的庫,包括 Boost.Any (它可以持有任意類型的值),從而為處理這些類型提供了一個安全而健壯的環境。C++ 的聯合只對內建類型以及 POD 類型有用,但這個庫提供的非無類聯合可以支持所有類型。最后,效率方面也被考慮到了,這個庫基于棧存儲來保存它的值,從而避免了昂貴的堆分配。
- 序
- 前言
- 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 總結