Boost源码剖析之:Tuple Types(原创)

类别:编程语言 点击:0 评论:0 推荐:

动机[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 DevideInts(int n,int d)

{

??? return std::pair(n/d,n%d);

}

这是个可行的方案。简洁,优雅。

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

std::pair someFunc();

的确,这也能够工作,但是毕竟不够精致!如果返回值再增加,代码将会愈发丑陋不堪。另一个可行的方案是自己定义一个结构来保存三个乃至更多值,然而随着不同函数的需要你可能需要定义各种不同的类似这样的结构,这太费神了。

所以,我们需要的是一个高度可复用的,能够用来保存任意型别的任意多个变量的类----Tuple Types(Tuple的意思是“元组,数组”)。正如你所想象的,泛型正是提供代码复用的最佳手段,它将型别信息抽象出来,直到用户真正使用那些代码时,型别信息才得以落实(所谓“具现化”)。

Boost库提供了所谓的Tuple Types,它没有std::pair的限制,于是你可以写:

boost::tuple someFunc(); //tuple目前能够支持多达10个参数

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

tuple t(8,9,10);

std::cout

本文地址:http://com.8s8s.com/it/it28457.htm