`
lunan
  • 浏览: 77955 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

boost::tuple

阅读更多
/*

1)Boost::tuple就为我们提供了一种类似于匿名struct的方法为我们解决函数的多个返回值的问题。
2)对boost::tuple你可以绑定10个参数,或者你可以迭代实现无限多参数的情况。
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个值的类型。

*/

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

#include "boost/tuple/tuple.hpp"
#include "boost/tuple/tuple_comparison.hpp"
#include "boost/tuple/tuple_io.hpp"

#include "boost/bind.hpp"

#include "boost/array.hpp"
#include "boost/assign/list_of.hpp"

//Tuples 与 for_each
template <typename Function>
void for_each_element( const boost::tuples::null_type&, Function)
{}
template <typename Tuple, typename Function>
void for_each_element(Tuple& t, Function func)
{
func(t.get_head()); for_each_element(t.get_tail(),func);
}

struct print
{
template <typename T> void operator()(const T& t)
   { std::cout << t << '\n'; }
};

template <typename T> struct print_type
{
void operator()(const T& t)
     { std::cout << t << '\n'; }
template <typename U> void operator()(const U& u) {}
};

//虚函数
class base
{
public:
virtual ~base() {};
virtual void test()
{ std::cout << "父类::test()\n"; }
};

class derived : public base
{
public:
virtual void test()
        { std::cout << "子类::test()\n"; }
};

//数组排序
template <int Index> class element_less
{
public:
template <typename Tuple> bool operator()(const Tuple& lhs,const Tuple& rhs) const
{
return boost::get<Index>(lhs) < boost::get<Index>(rhs);
}
};

//函数返回多个值
boost::tuple<int, int> divide_and_modulo(int a, int b)
  {
    return boost::make_tuple<int, int> (a/b, a%b);
  }

int main(int argc, _TCHAR* argv[])
{
    //虚函数
    boost::tuple<int,         std::string,derived> tup1(-5,"Tuples");
boost::tuple<unsigned int,std::string,base   > tup2;
tup2=tup1;
tup2.get<2>().test();
tup1.get<2>().test();

std::cout << "Interesting value: " << tup2.get<1>() << '\n';

   //定义一个tuple
   typedef boost::tuple<short,int,long> Mtuple;
   std::vector<Mtuple> vec ;
   vec= boost::assign::tuple_list_of(3,2,7)(6,2)(7,1)(5,9); //第一"tuple"必须满参数
   int ir = 1;
   vec.push_back(boost::make_tuple(1,boost::ref(ir),1));

   //降序排列
   std::sort(vec.begin(),vec.end(),element_less<0>());
   std::cout << "After sorting: " << vec[0].get<0>() << '\n' << vec[1].get<0>() << '\n' << vec[2].get<0>() << '\n';
  
   //升序排列
   std::sort(vec.begin(),vec.end(),boost::bind(std::greater<short>(),
                                           boost::bind(&Mtuple::get<0>,_1),
   boost::bind(&Mtuple::get<0>,_2)) );
  
   std::cout << "After sorting: " << vec[0].get<0>() << '\n' << vec[1].get<0>() << '\n' << vec[2].get<0>() << '\n';

    //绑定tuple
short  s;
int    d;
double b;
boost::tie(s,d,b)=vec[0];
   
//for_each
typedef boost::tuple<short,int,long> my_tuple;
boost::tuple<int,short,double> nums(111,222,3.01);
for_each_element(nums, print());
for_each_element(nums, print_type<int>());

//使用 make_tuple 来从函数返回元组
boost::tuple<int, int> t = divide_and_modulo(8, 3);
std::cout << t << '\n';

return 0;
}
分享到:
评论
1 楼 lunan 2011-11-29  
如果在头文件中我引用如下:

#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"
using namespace boost::lambda;

那么 bind(&Mtuple::get<0>,_1),  会有问题

有人说是:因为get有const和非const   2个重载版本。得先static_cast指针转换以获取正确的版本。
例子如下:
void   foo(int);
void   foo(float);
int   i;  
    ...
bind(&foo,   _1)(i);                                                         //   error  
    ...
void   (*pf1)(int)   =   &foo;
bind(pf1,   _1)(i);                                                           //   ok
bind(static_cast <void(*)(int)> (&foo),   _1)(i);   //   ok

没看明白。这个问题未完待续。
解决办法是加上命名空间,写出的效果如下:

#include "stdafx.h"

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <map>

#include "boost/tuple/tuple.hpp"
#include "boost/tuple/tuple_comparison.hpp"
#include "boost/tuple/tuple_io.hpp"

#include "boost/array.hpp"
#include "boost/assign/list_of.hpp"

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
using namespace boost;

#include <boost/bind.hpp>

class Person
{
public:
Person(){}
Person(const std::string& name) : name_(name){}

std::string& Name()
{ return name_; }

private:
std::string name_;

};


int main()
{
std::map<int, Person> persons;
persons[123] = Person("Amy");
persons[234] = Person("Ralph");
persons[345] = Person("Simon");
persons[456] = Person("Maggie");
   
//非lamad::bind 编译有问题?
std::cout << "Ralph's Id is: " <<
              std::find_if( persons.begin(), persons.end(), 
  ::lambda::bind(&Person::Name,::lambda::bind(&std::map<int, Person>::value_type::second, ::lambda::_1)) == "Ralph" )->first;


typedef boost::tuple<short,int,long> Mtuple;
std::vector<Mtuple> vec ;
vec= boost::assign::tuple_list_of(3,2,7)(6,2)(7,1)(5,9);


std::cout << "bind tuple: " <<
std::find_if( vec.begin(), vec.end(),
bind(&Mtuple::get<0>,_1) == 7 )->get<1>();
return 0;
}


相关推荐

    类似Boost中Tuple的实现

    Boost库中的`Tuple`是C++社区广泛使用的工具,因为它提供了灵活且类型安全的方式来组合和传递多个值。本篇文章将探讨如何实现一个类似于Boost的`Tuple`功能,并介绍与之相关的编程知识点。 首先,`Tuple`的基本概念...

    C++标准库Boost程序库导论

    Boost在这一领域也贡献颇多,其中最为人熟知的是`boost::array`、`boost::multi_array`、`boost::tuple`、`boost::variant`等容器。这些容器提供了更灵活的选择,比标准库中的容器更加多样化,能够满足不同场景下的...

    Beyond.the.C++.Standard.Library.An.Introduction.to.Boost.pdf

    `boost::tuple`则提供了一个更强大和灵活的方式来处理固定大小的数据集合。 #### 七、正则表达式支持 Boost.Regex是Boost库中一个强大的正则表达式支持库,它不仅提供了丰富的正则表达式匹配功能,还支持各种复杂...

    C++ Boost 库中文文档

    2. **标准库前驱**:许多Boost库已被采纳进入C++标准库,如`shared_ptr`、`unique_ptr`、`variant`和`tuple`等。 3. **跨平台**:Boost库在多种操作系统和编译器上都能良好运行,包括Windows、Linux、Mac OS X等。 4...

    元组:Boost.org元组模块

    尽管C++11标准库中引入了`std::tuple`,但Boost元组提供了一些额外的功能,如类型安全的`get`函数,元组到元组的转换,以及更好的兼容性和可扩展性。在某些情况下,Boost元组可能是更优的选择。 6. **元组和lambda...

    没有boost命名空间的Boost.PFR.zip

    这个库在早期的版本中, Boost 库包含了它,但后来为了保持 Boost 的精简和避免命名空间冲突,Boost.PFR被移出,不再在boost命名空间下使用。因此,我们有了“没有boost命名空间的Boost.PFR”。 Boost.PFR库的核心...

    tuple_cast:在 c++11 元组之间进行转换

    因此,开发者通常会自己实现或者使用第三方库如 Boost 库中的`boost::tuple`来完成元组之间的转换。 Jaakko Järvi是一位知名的C++开发者,他在C++社区中有着显著的贡献,包括对C++标准的制定工作。他提出的`tuple_...

    boost 1.41 中文文档,使用帮助,教程手册

    汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...

    介绍Boost libraries: C++编程的下一个突破

    7. Tuple:元组库允许程序员创建和操作固定大小的、异质的值集合。这在函数返回多个值时特别有用,省去了定义结构体或类的麻烦。 Boost库的其他部分还包括对数据结构、容器、迭代器、算法、函数对象、泛型编程、...

    pfr:std :: tuple类似用户定义类型的方法,没有任何宏或样板代码

    增强PFR 这是一个C ++ 14库,用于非常基本的反射,使您可以按索引访问结构元素,并为用户定义的类型提供其他std::tuple类的方法,而无需任何宏或样板代码。检测结果分行建立测试覆盖率更多信息开发: 主: 激励实例...

    boost_1_34_0的包含文件(boost目录下的全部文件)

    Boost库的核心目标是推动C++标准的发展,并且很多Boost库最终被纳入到了C++标准库中,例如`shared_ptr`、`unique_ptr`、`bind`、`lambda`、`variant`和`tuple`等。下面将详细探讨一些在`boost_1_34_0`中重要的库和...

    BOOST学习资料整理收集

    4. **标准化推动者**:许多Boost库如`shared_ptr`、`unique_ptr`、`tuple`、`lambda`等已进入C++11标准库。 二、Boost库的主要组件: 1. **Boost.And.STL学习资料**:这是一份关于如何结合使用Boost库和STL...

    THE BOOST C++ LIBRARIES

    THE BOOST C++ LIBRARIES是一份...14.2 Boost.Tuple 14.3 Boost.Any 14.4 Boost.Variant 14.5 Exercises Chapter 15: Error Handling 15.1 General 15.2 Boost.System 15.3 Boost.Exception Chapter 16: Cast Operators

    rebind:C++ 模板操作库

    在重新绑定中,您可以将类型存储在您想要的任何类中,例如std::tuple或空结构: template struct Container { }; Rebind本身是从一个实例中获取模板参数并将它们应用于不同的模板 - 例如: # include " rebind...

    Boost.org融合模块.zip

    7. **混合器(Mixer)**:混合器允许将不同类型的元素组合成一个新的结构,如boost::fusion::tuple。 在“fusion-develop”目录下,可能包含的是Boost.Fusion的开发版本,这通常包括源代码、测试用例、示例以及文档...

    Boost 库中文版

    2. **容器**(Containers):如`multi_array`提供多维数组,`fusion`则与C++11的`std::tuple`类似,但提供了更丰富的操作。 3. **算法**(Algorithms):Boost提供了一套扩展的算法库,如`assign`用于快速填充容器...

    c++资源Boost库及指南

    10. **Boost.Tuple**:提供了一种更灵活的数据结构来存储多个不同类型的值。 #### 三、Boost库的安装与配置 - **Windows平台**:可以通过预编译的二进制包进行安装,也可以使用CMake等工具进行自定义编译。 - **...

    C++11_14高级编程 Boost程序库探秘, 3rd,深入理解C++11,Effective+C,并发

    6. **变长参数模板(Variadic Templates)**:允许函数或模板接受任意数量的参数,如`std::tuple`和`std::initializer_list`的实现。 7. **统一的构造/初始化(Uniform Initialization)**:使用花括号`{}`进行初始...

Global site tag (gtag.js) - Google Analytics