Boost库中提供了三种比较实用的数据结构,分别是tuple、any和variant。它们的共同优点就是支持类型安全地存储和获取数据。灵活地使用这三种数据结构,对我们进行程序设计无疑是大有裨益的。下面分别加以介绍。
tuple支持一次直接声明和使用n个不同数据类型的变量。对于有多个返回值的函数,我们再也不用定义一个结构体作为函数的返回值类型了,也不用通过对参数进行引用来传出返回值(这样返回值的概念不太明确),而是可以直接使用tuple。
◆ 声明一个tuple类型的对象:tuple
◆ 获得tuple中某个变量的值:string s = get<2>(triple);
◆ 获得tuple中所有变量的值:tie(nAdd, dbSub, strText) = triple;
◆ 通过几个变量构造一个tuple类型的变量:tuple
any支持存储任意类型的变量,但它只允许你在知道类型的前提下访问它的值。如果类型不符合,则any会抛出一个bad_any_cast的异常。如果访问的是指针,则类型符合时返回的指针是一个有效值,否则返回的指针为空(此时不会抛出异常)。
◆ 给any赋任意类型的值:any a; a = 42; a= string("hello world"); a=3.14;
◆ 获得any中存储的值:double dbTemp = any_cast
◆ 获得any中存储值的指针:string *pString = any_cast
variant支持存储和操作来自于多个不同类型的变量。获得variant中当前存储的值时,如果给定的类型与实际存储值的类型不符合,会抛出一个bad_get的异常。如果要获得的是指针,则类型符合时返回的指针是一个有效值,否则返回的指针为空(此时不会抛出异常)。这里需要着重谈一下variant与tuple和any的区别:tuple可以保存n个变量的值,而variant只能保存一个变量的值; any可以保存任意类型的变量,而variant只能保存指定数据类型的变量。varianty与union有相似之处;
◆ 声明一个variant类型的对象:variant
◆ 给variant赋值: va=3.14; va=42;
◆ 获得variant中当前存储的值:int nTemp = get
◆ 获得指向variant中存储的值的指针:string *pString = get
在使用boost::any 和 boost::variant的过程中遇到几个小问题,按个人理解对二者做了一下比较。令人最遗憾的是与boost:: 不兼容。 More...
* 非模板类
这意味着即时是跨dll也可以方便地使用,支持无限种变量。
* boost::
不支持。有人对此进行了激烈的讨论,在。
* 模板类
由于模板参数的限制(支持的变量类型需要列在模板参数列表里),因而只支持有限种变量。
如果需要跨DLL使用,声明处需要引用所有需要的变量
* 基于stack
这意味着对于动态创建的对象,内存需要自己管理。
* 支持boost::
Boost::any
Boost::variant
是否模板类
否
是
基于stack
是也不是
是
是否支持boost::
否
是