## 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 总结