Boost::tuple就为我们提供了一种类似于匿名struct的方法为我们解决函数的多个返回值的问题。既增强了代码的可读性有不增加代码量。其实在STL中已经有这样的特例,std::pair其实就是boost::tuple的2个参数的特例

一 Boost::tuple

    很多的时候我们经常需要为我们的函数返回多个值,一般的做法是通过传入非常量的指针或引用,但是这样的话可能可读性就要差一些,使用者可能需要确切的文档才能确定到底哪个是返回值,为了更好的可读性,我们可以使用class或struct来封装我们要返回的多个值,然后返回封装struct或class,但是使用这种方法的弊端就是增加的程序的代码量,最好的解决办法其实我们可以通过一种匿名的struct或class来解决这个问题。
   
    Boost::tuple就为我们提供了一种类似于匿名struct的方法为我们解决函数的多个返回值的问题。既增强了代码的可读性有不增加代码量。其实在STL中已经有这样的特例,std::pair其实就是boost::tuple的2个参数的特例,对boost::tuple你可以绑定更多的参数,或者你可以迭代实现无限多参数的情况。
  

二 源码剖析

头文件: "boost/tuple/tuple.hpp",它包含了 tuple 类模板及库的核心部分。

头文件: "boost/tuple/tuple_io.hpp",包含了对 tuple 的输入输出操作符。

头文件: "boost/tuple/tuple_comparison.hpp",包含了 tuple 的关系操作符。

为了方便使用,Tuple 库中有些名字位于名字空间 boost:如 tuple, make_tuple, tie, 和 get.

函数说明:

  1)构造函数
  2)拷贝构造函数
  3)t.get<N>()或get<N>(t) ,取得第N个值
  4)make_tuple ,生成tuple
  5)tie , 生成都是ref的tuple
  6) 重载比较运算符 ,可以直接用来比较
  7)重载输入输出运算符 ,可以直接使用IO
  8)get_head()和get_tail()函数,用来取得值
  9)length<>和element<>用来得到tuple的size和第N个的值类型
 10)如果使用boost::TR1,则还可以使用std::tr1::tuple_size(),std::tr1::tuple_element(),分别用来得到tuple的size和第N个值的类型。


三 实例

   1)tuple的构造,拷贝构造函数,get成员函数,get全局函数,make_tuple全局函数。  

引领Boost(三)(Boost::tuple)#include <string>
引领Boost(三)(Boost::tuple)#include 
<iostream>
引领Boost(三)(Boost::tuple)#include 
"boost/tuple/tuple.hpp"
引领Boost(三)(Boost::tuple)
引领Boost(三)(Boost::tuple)boost::tuples::tuple
<int,double> get_values()
}

 

   2)使用tie函数模版来生成对ref的绑定的tuple,tuple的比较使用,tuple的输入输出:

引领Boost(三)(Boost::tuple)#include <string>
引领Boost(三)(Boost::tuple)#include 
<iostream>
引领Boost(三)(Boost::tuple)#include 
<vector>
引领Boost(三)(Boost::tuple)#include 
<algorithm>
引领Boost(三)(Boost::tuple)#include 
"boost/tuple/tuple.hpp"
引领Boost(三)(Boost::tuple)#include 
"boost/tuple/tuple_comparison.hpp"
引领Boost(三)(Boost::tuple)#include 
"boost/tuple/tuple_io.hpp"
引领Boost(三)(Boost::tuple)template 
<int Index> 
引领Boost(三)(Boost::tuple)
class element_less
}

 

四 注意

1)函数 make_tuple 类似于 std::make_pair. 缺省情况下,make_tuple 设置元素类型为非const, 非引用的,即是最简单的、根本的参数类

型。

2)为了使一个 tuple 的元素设为引用类型,你要使用函数 boost::ref, 它来自另一个名为 Boost.Ref 的 Boost 库。

3)如果元素需要是 const 引用的,就使用来自 Boost.Ref 的 boost::cref。

4)如果你要使绑定的每个元素变量都为ref,则可以使用tie函数。

五 参考

1)Beyond the C++ Standard Library: An Introduction to Boost
2)boost在线document

原文链接:http://www.cppblog.com/mzty/archive/2007/08/21/30509.html

相关文章: