#include<iostream>

#include<string>

#include<boost/tuple/tuple.hpp>

#include<boost/tuple/tuple_io.hpp>

#include <boost/tuple/tuple_comparison.hpp>



using namespace std;



int main(){

    //boost::tuple 扩展了 C++ 的数据类型 std::pair 用以储存多个而不仅仅是两个值。

//除了 boost::tuple。 这一章还涵盖了类 boost::any 和 boost::variant 以储存那些不确定类型的值。

当中 boost::any 类型的变量使用起来就像弱类型语言中的变量一样灵活。 还有一方面, boost::variant 类型的变量能够储存一些提前定义的数据类型, 就像我们用 union 时候一样。

    typedef boost::tuple<std::string, std::string> person1;

    person1 p1("Boris", "Schaeling");

    cout << p1 << std::endl;

    //就像 std::pair 有辅助函数 std::make_pair() 一样, 一个元组也能够用它的辅助函数 boost::make_tuple() 来创建。

    std::cout << boost::make_tuple("Boris", "Schaeling", 43) << std::endl;



     //一个元组也能够存储引用类型的值。

     std::string s = "Boris";

     std::cout << boost::make_tuple(boost::ref(s), "Schaeling", 43) << std::endl;



     //由于 "Schaeling" 和 43 是按值传递的,所以就直接存储在了元组中。 与他们不同的是: person 的第一个元素是一个指向 s 的引用。 Boost.Ref 中的 boost::ref() 就是用来创建这种引用的。

相对的。 要创建一个常量的引用的时候, 你须要使用 boost::cref() 。



     //在学习了创建元组的方法之后, 让我们来了解一下訪问元组中元素的方式。

std::pair 仅仅包括两个元素。 故能够使用属性 first 和 second 来訪问当中的元素。

但元组能够包括无限多个元素, 显然。 我们须要用还有一种方式来解决訪问的问题。



     typedef boost::tuple<std::string, std::string, int> person2;

     person2 p2 = boost::make_tuple("Boris", "Schaeling", 43);

     std::cout << p2.get<0>() << std::endl;

     std::cout << boost::get<0>(p2) << std::endl;



     //我们能够用两种方式来訪问元组中的元素: 使用成员函数 get() , 或者将元组传给一个独立的函数 boost::get() 。 使用这两种方式时, 元素的索引值都是通过模板參数来指定的。

样例中就分别使用了这两种方式来訪问 p 中的第一个元素。

因此, Boris 会被输出两次。



     //另外。 对于索引值合法性的检查会在编译期执行, 故訪问非法的索引值会引起编译期错误而不是执行时的错误。



     //对于元组中元素的改动。 你相同能够使用 get() 和 boost::get() 函数。

typedef boost::tuple<std::string, std::string, int> person3;

     person3 p3 = boost::make_tuple("Boris", "Schaeling", 43);

     p3.get<1>() = "Becker";

     std::cout << p3 << std::endl;



     //get() 和 boost::get() 都会返回一个引用值。 样例中改动了 lastname 之后将会输出: (Boris Becker 43) 。

//Boost.Tuple 除了重载了流操作运算符以外, 还为我们提供了比較运算符。 为了使用它们, 你必需要包括对应的头文件: boost/tuple/tuple_comparison.hpp 。



     typedef boost::tuple<std::string, std::string, int> person4;

     person4 p4 = boost::make_tuple("Boris", "Schaeling", 43);

     person4 p5 = boost::make_tuple("Boris", "Becker", 43);

     std::cout << (p4 != p5) << std::endl;



     //上面的样例将会输出 1 由于两个元组 p1 和 p2 是不同的。





}

编译后输出:

(Boris Schaeling)

(Boris Schaeling 43)

(Boris Schaeling 43)

Boris

Boris

(Boris Becker 43)

1

boost::tuple 深入学习解说的更多相关文章

  1. 【Todo】Boost安装与学习

    现在这里找下载包 http://sourceforge.net/projects/boost 我找的是 1_62_0 下面是从公司wiki上找到的一个说明. boost & thrift安装步 ...

  2. boost tuple

    boost::tuple is a generalized version of std::pair. While std::pair can only store exactly two value ...

  3. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  4. boost asio io_service学习笔记

    构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionSta ...

  5. boost timer代码学习笔记

    socket连接中需要判断超时 所以这几天看了看boost中计时器的文档和示例 一共有五个例子 从简单的同步等待到异步调用超时处理 先看第一个例子 // timer1.cpp: 定义控制台应用程序的入 ...

  6. Boost.Coroutine2:学习使用Coroutine(协程)

    function(函数)routine(例程)coroutine (协程) 函数,例程以及协程都是指一系列的操作的集合. 函数(有返回值)以及例程(没有返回值)也被称作subroutine(子例程), ...

  7. 初探boost之noncopyable学习笔记

    noncopyable 功能 同意程序轻松实现一个不可复制的类. 需包括头文件 #include<boost/noncopyable.hpp>     或 #include<boos ...

  8. Python tuple元组学习

    1.tuple和list非常类似,但是tuple一旦初始化就不能修改 classmates = ('Michael', 'Bob', 'Tracy') 现在,classmates这个tuple不能变了 ...

  9. std::locale与boost::locale的学习

    1. 什么是facet, locale facet ['fæsɪt]的原意,是宝石切割出来的一个平面. locale[ləʊˈkæl],表示本地化, locale the container that ...

随机推荐

  1. Shell编程中Shift的用法【转】

    本文转载自:http://www.cnblogs.com/image-eye/archive/2011/08/20/2147153.html Shell编程中Shift的用法 位置参数可以用shift ...

  2. 【Codeforces 105D】 Bag of mice

    [题目链接] http://codeforces.com/contest/148/problem/D [算法] 概率DP f[w][b]表示还剩w只白老鼠,b只黑老鼠,公主胜利的概率,那么 : 1. ...

  3. SpringBoot之表单验证@Valid

    转自:https://www.cnblogs.com/chenlove/p/8708627.html SpringBoot提供了强大的表单验证功能实现,给我们省去了写验证的麻烦: 这里我们给下实例,提 ...

  4. 安装MySQL最后一步出现错误Error Nr.1045解决方法

    转自:https://blog.csdn.net/gsls200808/article/details/46846019 安装MySQL最后一步出现错误Error Nr.1045 Connection ...

  5. Linux Shell Scripting Cookbook 读书笔记 2

    cat,script,find, xargs, tr, tmp文件,字符串截取,批量文件重命名,固定大小文件,自动化交互 1. cat的用法 压缩连续的空白行 cat -s file 也可以用tr,将 ...

  6. MYSQL工具之binlog2sql闪回操作

    文档结构: 在生产环境中如果遇到误删,改错数据的情况,利用mysql闪回工具binlog2sql,可以实现数据的快速回滚,从binlog中提取SQL,并能生成回滚SQL语句.Binlog以event作 ...

  7. C# net winform wpf 发送post数据和xml到网页

    由于项目需要发送数据到网页 这里用aspx做测试 采用post以及get发送数据,页面进行数据  首先这个东西很简单很简单,基本上学过的都会,但是原谅一直搞cs几乎不搞bs的猿类吧.三四年没接触bs. ...

  8. 【Oracle】Rman简介

    1.备份和恢复功能的用途: –保护数据 -介质故障 -用户错误 -应用程序错误 –数据保存和历史数据保留 –数据传输 2.典型的备份和恢复任务 –通过配置数据库实现可恢复 –定义备份计划 –对不同类型 ...

  9. C#关于VSHOST.EXE停止工作的解决办法,VS2008

    主要原因就是电脑系统系统32位和64位的问题在项目属性中修改下即可. 方法: 右击项目 - 属性 - 生成 - 目标平台 - Any CPU[改为x86] 虽然简单,但如不知原因却恼火的紧,贴出来如有 ...

  10. CUDA 编程实例:计算点云法线

    程序参考文章:http://blog.csdn.net/gamesdev/article/details/17535755  程序优化2 简介:CUDA ,MPI,Hadoop都是并行运算的工具.CU ...