## Any
### 頭文件: `"boost/any.hpp"`
類 `any` 允許對任意類型進行類型安全的存儲和取回。不象無類類型,`any` 保存了類型信息,并且不會讓你在不知道正確類型的情況下獲得存入的值。當然,有辦法可以讓你詢問關于類型的信息,也有測試保存的值的方法,但最終,調用者必須知道在 `any` 對象中的值的真實類型,否則不能訪問`any`。可以把 `any` 看作為上鎖的安全性。沒有正確的鑰匙,你不能進入其中。`any` 對它所保存的類型有以下要求:
* CopyConstructible 它必須可以復制這個類型
* Non-throwing destructor 就象所有析構函數應該的那樣!
* Assignable 為了保證強異常安全(不符合可賦值要求的類型也可以用于 `any`, 但沒有強異常安全的保證)
以下是 `any` 的公有接口:
```
namespace boost {
class any {
public:
any();
any(const any&);
template<typename ValueType>
any(const ValueType&);
~any();
any& swap(any &);
any& operator=(const any&);
template<typename ValueType>
any& operator=(const ValueType&);
bool empty() const;
const std::type_info& type() const;
};
}
```
### 成員函數
```
any();
```
缺省構造函數創建一個空的 `any` 實例,即一個不含有值的 `any`。當然,你無法從一個空的`any`中取回值,因為沒有值存在。
```
any(const any& other);
```
創建一個已有 `any` 對象的獨立拷貝。`other` 中含有的值被復制并存入 `this`.
```
template<typename ValueType> any(const ValueType&);
```
這個模板構造函數存入一個傳入的`ValueType`類型參數的拷貝。參數是一個 `const` 引用,因此傳入一個臨時對象來存入`any`是合法的。注意,該構造函數不是 explicit 的,如果是的話, `any` 會難以使用,而且也不會增加安全性。
```
~any();
```
析構函數銷毀含有的值,但注意,由于對一個裸指針的析構不會調用operator `delete` 或 operator `delete[]` ,所以在`any`中使用指針時,你應該把裸指針包裝成一個象 `shared_ptr` (見 "[Library 1](../Text/content.html#ch01): [Smart_ptr 1](../Text/content.html#ch01)") 那樣的智能指針。
```
any& swap(any& other);
```
交換存在兩個 `any` 對象中的值。
```
any& operator=(const any& other);
```
如果`any`實例非空,則丟棄所存放的值,并存入`other`值的拷貝。
```
template<typename ValueType>
any& operator=(const ValueType& value);
```
如果`any`實例非空,則丟棄所存放的值,并存入 `value` 的一份拷貝,`value`可以是任意符合`any`要求的類型。
```
bool empty() const;
```
給出`any`實例當前是否有值,不管是什么值。因而,當`any`持有一個指針時,即使該指針值為空,則 `empty` 也返回 `false` 。
```
const std::type_info& type() const;
```
給出所存值的類型。如果 `any` 為空,則類型為 `void`.
### 普通函數
```
template<typename ValueType>
ValueType any_cast(const any& operand);
```
`any_cast` 讓你訪問`any`中存放的值。參數為需要取回值的 `any` 對象。如果類型 `ValueType` 與所存值不符,`any` 拋出一個 `bad_any_cast` 異常。請注意,這個語法有點象 `dynamic_cast`.
```
template<typename ValueType>
const ValueType* any_cast(const any* operand);
```
`any_cast` 的一個重載,接受一個指向 `any` 的指針,并返回一個指向所存值的指針。如果 `any` 中的類型不是 `ValueType`, 則返回一個空指針。請再次注意,這個語法也有點象 `dynamic_cast`.
```
template<typename ValueType>
ValueType* any_cast(any* operand);
```
`any_cast` 的另一個重載,與前一個版本相似,但前一個版本使用 `const` 指針的參數并返回 `const` 指針,這個版本則不是。
### 異常
```
bad_any_cast
```
當試圖將一個`any`對象轉換為該對象所存類型以外的其它類型,將拋出該異常。`bad_any_cast` 派生自 `std::bad_cast`. 注意,使用指針參數調用 `any_cast` 時,將不拋出異常(類似于對指針使用 `dynamic_cast` 時返回空指針一樣),反之對引用類型使用 `dynamic_cast` 則會在失敗時拋出異常。
- 序
- 前言
- 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 總結