Beyond the C++ Standard Library: An Introduction to Boost -- Library 6.1 Any

Part II: 容器及数据结构

本部分讨论三个库:Boost.Any, Boost.Variant, 和 Boost.Tuple. 在某种意义上,它们都是容器,虽然它们与标准库的容器类毫无共同之处。它们都是非常有用的库,许多人和我一样,每天都在使用它们来解决编程上的问题。它们所解决的问题是C++或C++标准库所未能覆盖的范畴,因此它们确实是我们的库工具箱的非常重要的扩展。想一下基础数据结构的有效性将影响我们编程及设计的方法,这是多么有趣啊。如果没有这些数据结构,我们将需要自己来实现它,而我们通常只会考虑到在解决方案范畴内的实现,这样会大大限制我们的工作成果的可重用性。当然对于所有编程风格,存在着共同的主题,而普遍性和基本性的折衷可以很好地完成这项工作。库的灵活性不仅可以让我们完成当前的任务,更可以让我们在以后解决更多的类似问题。这些库在某种意义上也扩展了我们的C++词汇表,而且更多的用户使用这些库,就会有更大的社区使用同样的词汇。我确信本章中的每一个库都应该在每个C++专业工具箱中占有一席之地。

Library 6. Any

 

Any 库如何改进你的程序?

  • 任意类型的类型安全存储以及安全的取回

  • 在标准库容器中存放不同类型的方法

  • 可以在无须知道类型的情况下传送类型

Any库提供一个类型, any, 它允许存入任意类型且稍后取回,而不损失类型安全性。它有点象是可变类型的化合物:它可以持有任意类型,但你必须知道类型才能取回值。有很多次你想在同一个容器中存入互不相关的类型。有很多次某些代码只想从一个指针向另一个指针传送数据,而不关心数据的类型。从表面看,这些事情很容易做。它们可以通过一个无类的类型来实现,如 void*. 它们也可以通过使用一个含有不同类型的union来实现。有很多可变类型通过一些类型标识机制来实现。不幸的是,所有这些都缺乏类型安全性,而只有在最可控的情形下我们才应该故意绕过类型系统。标准库的容器是要通过它们所包含的类型来特化的,这意味着不可能把不同类型的元素存入容器之内。幸运的是,解决的方案不一定要 void*, 因为 Any 库允许你将存入不同的类型而稍后取回。没有办法在不知道实际类型的情况下取回存入的值,类型安全从而得到保证。

在设计框架时,不可能预先知道哪些类型要和框架类一起使用。一个常见的方法是,要求框架的使用者遵守某种接口,或者从框架所提供的某个基类进行派生。这是合理的,因为框架可能需要与不同的高级类进行通信才能使用。但是也存在这样的情形,框架对于存入或接受的类型无须(或不能)知道任何相关信息。不要绕过类型系统去使用 void* 方法,框架可以使用 any

 

Any 如何适用于标准库?

Any的一个重要特性是,它提供了存储不同类型的对象到标准库容器中的能力。它也是一种可变数据类型,这正是C++标准库非常需要而又缺乏的。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值