下载此文档

boost源码剖析之tuple types.doc


文档分类:IT计算机 | 页数:约44页 举报非法文档有奖
1/44
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/44 下载此文档
文档列表 文档介绍
boost源码剖析之:Tuple Types
刘未鹏(pongba)
C++的罗浮宫()

Note: 并非新作,04年曾放在blog上,后来删掉了,不过网上到处有转载。这是修改之后的版本。

动机[1]
假设你有这样一个函数:它接受两个整型数据并返回它们整除的结果,像这样:

int DevideInts(int n,int d)
{
return n/d;
}

但是我们可能需要更多信息,比如,余数。函数的返回值已被占用,我们可以为函数加一个参数:

int DevideInts(int n,int d,int& Remainder)
{
Remainer=n%d;
return n/d;
}

但是这样的函数形式未免有些拖沓丑陋。我们可以使用std::pair<>来定义函数的返回值类型(顾名思义,std::pair<>可以将两个值凑成一对),像这样:

std::pair<int,int> DevideInts(int n,int d)
{
return std::pair<int,int>(n/d,n%d);
}

这是个可行的方案。简洁,优雅。
然而,这个方案只能提供两个返回值的捆绑,如果现在需要返回三个int呢?唔...你可能很快想到这样组织代码:

std::pair<int,std::pair<int,int> > someFunc();

的确,这也能够工作,但是毕竟不够精致!如果返回值再增加,代码将会愈发丑陋不堪。另一个可行的方案是自己定义一个结构来保存三个乃至更多值,然而随着不同函数的需要你可能需要定义各种不同的类似这样的结构,这太费神了。
所以,我们需要的是一个高度可复用的,能够用来保存任意型别的任意多个变量的类——Tuple Types(Tuple的意思是“元组,数组”)。正如你所想象的,泛型正是提供代码复用的最佳手段,它将型别信息抽象出来,直到用户真正使用那些代码时,型别信息才得以落实(所谓“具现化”)。
Boost库提供了所谓的Tuple Types,它没有std::pair的限制,于是你可以写:

//tuple<>目前能够支持多达10个模板参数
boost::tuple<int,int,int> someFunc();

事实上tuple能够提供的不止这个,tuple对IO流的支持能够允许你写这样的代码:

tuple<int,int,int> t(8,9,10);
std::cout<<t; //输出(8 9 10)

tuple甚至还支持类似的流控制,像这样:

std::cout << tuples::set_open(‘[‘)
<< tuples::set_close(‘]’)
<< tuples::set_delimiter(‘,’)
<< t;
//输出[8,9,10]

好了,你可能已经不耐烦了,毕竟,以上的内容非常浅显。然而我必须要告诉你这些,因为你首先得知道tuple的设计目的才能够去了解它。好在这个枯燥的过程已经结束了。深吸一口气,我们去看一看tuple的设计细节和最本质的东西——源代码。

设计目标
首先,了解tuple的设计目标十分重要。上面所讲的只是一个总的设计目标。下面两个细节设计目标才是真正需要和体现技术的地方(并且考虑它们如何能够最佳实现是非常有趣的事情,当然,在你的种种考虑之后,你得承认,Boost库的设计无疑是最精致和高效的),容我向你阐述它们:

tuple中的数据成员的个数应该具有某种动态特性。具体的说就是如果你像这样具现化tuple: tuple<int,int> t。则t某种程度上应该只需要sizeof(int)*2大小的内存来存放它的数值,不应该有多余的内存分配。而如果是tuple<int,int,int> t;则sizeof(t)某种程度上应该为sizeof(int)*3。当然,你可以利用模板偏特化来实现这一点——为提供不同模板参数个数的tuple实现不同的偏特化版本(也就是说,对提供了N个模板参数的tuple准备的偏特化版本中具有N个数据成员)——但是,想想这样做的代码数量吧!你也可以使用动态分配底层容器的策略,然而那会带来额外的负担,显然不如将数据直接放在tuple对象里,况

boost源码剖析之tuple types 来自淘豆网m.daumloan.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数44
  • 收藏数0 收藏
  • 顶次数0
  • 上传人学习好资料
  • 文件大小27 KB
  • 时间2021-08-08
最近更新