多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 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` 则会在失败时抛出异常。