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库也考虑了效率方面的问题,它基于栈存储来存储值,从而避免了昂贵的堆分配。






