首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

7.1  Variant库如何改进程序

●       对用户指定的类型集进行类型安全的存储和检索

●       提供了一个在标准库容器中存储异构类型的方法

●       变体访问的编译时检查

●       高效的、基于栈的变体存储

Variant库主要关注的是对一组限定的类型集合—— 即有差别联合—— 的类型安全的存储和检索。Boost.Variant库与Boost.Any库在特性上有许多共同之外,但是在功能上有不同的考虑。在日常编程中通常都需要使用有差别联合(变体类型)。保持类型安全的一个典型方法就是使用抽象基类,但这并不总是可以的;即便可以,堆分配和虚函数的代价也可能会很高。另外,大家也可以尝试使用不安全的无差别类型,例如void*(该类型会导致灾难);或者使用类型安全但没有限定的变体类型,例如Boost.Any。本章我们所讨论的Boost.Variant库,它支持限定的变体类型—— 也就是说变体类型的元素来源于一组支持的类型。

许多其他编程语言都支持变体类型,并证实对变体类型的支持是值得的。C++中内置的对变体类型的支持非常有限,只有某种形式的联合(union)的形式,而且还主要是为了与C兼容而保留的。Boost.Variant库通过一个类模板variant弥补了这种情形,同时还提供了安全地存储和检索值的工具。变体数据类型对外提供与当前值的类型无关的接口。如果大家曾经使用过别的变体类型,那么遇到的可能是仅能支持一组固定类型的类型。但是,这个库不是这样的;大家在使用variant时可以自己定义一组允许在variant中使用的类型,而一个程序中可以包含任意个完全不同的variant实例。为了检索存储在variant中的值,需要知道当前值的确切类型,或者使用所提供的类型安全的访问器(visitor)机制。访问器机制使Variant库与其他变体类型的库显然不同,这些库包括Boost.Any库(该库可以持有任意类型的值),从而为这些类型的处理提供了一个安全又健壮的环境。C++的联合只对内置的类型以及POD类型有用,但是Varian库为所有的类型提供了有差别联合。最后,Varian库也考虑了效率方面的问题,它基于栈存储来存储值,从而避免了昂贵的堆分配。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论