boost基础——any

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 字符串会引发编译错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值