any 是一种很特殊的容器,它只能容纳一个元素,但这个元素可以是任意的类型——int、double、string、标准容器或者任何的自定义类型。程序可以用 any 保存任意的数据,在任何需要的时候将它取出。这种功能与shared_ptr<void> 有些类似,但 any 类型安全。
any 位于名称空间 boost,为了使用 any 组件,需要包含头文件<boost\any.hpp>
。
any 能够容纳任意类型的原因在于它的构造函数以及赋值构造都是模板函数:
template<typename ValueType>
any(const ValueType & );
template<typename ValueType>
any& operator=(const ValueType& );
如果用 any 保存原始指针会造成内存泄露,替代方法是使用智能指针来存入 any 容器:
int* p = new int(10);
// 应该用 shared_ptr<int> p(new int(10))
any a = p;
// 危险,会造成内存泄露
空的 any 构造函数会创建一个空的 any 对象,不持有任何值。成员函数 empty() 可以判断 any 对象是否为空。如果 any 持有一个对象,那么成员函数 type() 返回对象的类型信息,是一个标准的 type_info 类的引用。
bool empty() const;
const std::type_info& type() const;
访问 any 中的元素
any 类本身不提供任何对内部元素的访问函数,而是使用了一个友元函数 any_cast<>();
template<typename T>
T any_cast(any& operand);
template<typename T>
T any_cast(const any& operand);
如下的例子:
any a(10);
int n = any_cast<int>(a);
assert(n == 10);
any_cast<int&>(a) = 20;
// 返回值也为 int&,可修改的左值
assert(any_cast<int>(a) == 20);
意义
any 的类接口很小且简单,它的出现让 C++ 的强类型检查失去了作用,C++ 仿佛变成了一种弱类型的动态语言。
any a(100);
a = string("char*")
a = vector<vector<int>>();
在 any 中存储字符串的时候,我们必须使用 std::string,如果直接使用 C 字符串会引发编译错误。