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: Smart_ptr 1") 那样的智能指针。
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
则会在失败时抛出异常。