boost::tuple 深入学习讲解

#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 深入学习讲解,布布扣,bubuko.com

时间: 2024-12-22 08:50:36

boost::tuple 深入学习讲解的相关文章

boost asio io_service学习笔记

构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionStatus并且在GetQueuedCompletionStatus 之后执行. Dispatch会首先检查当前thread是不是io_service.run/runonce/poll/poll_once线程,如果是,则直接运行. poll和run的区别 两者代码几乎一样,都是首先检查是否有outstan

boost tuple

boost::tuple is a generalized version of std::pair. While std::pair can only store exactly two values, boost::tuple lets you choose how many values to store. 1. boost::tuple replacing std::pair #include <boost/tuple/tuple.hpp> #include <boost/tup

Boost源码学习---weak_ptr.hpp

weak_ptr是辅助shared_ptr的智能指针.就像它的名字一样,是个"弱"指针:仅有几个接口,仅能完成很少工作.它可以从一个shared_ptr或weak_ptr对象构造,获取对资源的观测权,它是没有共享资源的,所以它的对象的创建不会引起指针引用计数的增加,它的对象的析构也不会引起计数器的减少. 它没有重载*和->,不能使用指针,主要的几个接口如下: long use_count() const//返回计数器数值 bool expired() const//判断指针是否失

Boost源码学习---scoped_ptr.hpp

scoped_ptr是一个智能指针,包装了指向堆上内存的指针.它对指针所有权加以限制,不能转让指针所有权,一旦scoped_ptr获取了指针的管理权,便不再释放,无法再从其取回来,就像scope意思一样,指针智能在作用域使用,不能转让出去.一旦离开scoped_ptr的作用域,将调用它的析构函数,释放指针,不用手动释放.下面是它的源代码: #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_SCOPED_

Boost源码学习---

scoped_array功能类似scoped_ptr,scoped_array管理的是new[]开辟的数组,其析构函数调用的是delete[]释放数组. 它没有重载解引用*和箭头操作符->,因为它不是普通指针,而是一个数组.它重载了[],可以像使用数组下标那样访问数组. #ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED #define BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED // (C) Copyrig

初探boost之noncopyable学习笔记

noncopyable 功能 同意程序轻松实现一个不可复制的类. 需包括头文件 #include<boost/noncopyable.hpp>     或 #include<boost/utility.hpp> 原理 在c++定义一个类时.假设不明白定义复制构造函数和复制赋值操作符.编译器会为我们自己主动生成这两个函数. 比如 class empty_class{ } : 实际上类似于 class empty_class { public: empty_class(const em

Spring Security 从配置入门 学习讲解。万恶之源------------web.xml

这段时间,工作闲了下来,接触了Spring Security,对于我一个基础很差的人来说,无疑是个挑战啊. 经过一段时间的摸索,终于有了点眉目,在这里,要特别感谢http://blog.csdn.net/u012367513/article/details/38866465 二当家的 博文对我的帮助.我的代码也是在他的基础上整理而来,只是增加了自己的一些见解. 再次感谢他的帮助. 我的基础很是薄弱,最然 二当家的 博文中已经讲解的很是清楚,但是我还是希望自己能过上一遍. 本文适宜读者: Spri

Boost源码学习---shared_ptr.hpp

最近在看Boost库源码,Boost库功能强大,但是其源代码太多,一一细读太过于耗费时间,毕竟还有其他东西要学习,所以决定对感兴趣的章节略读一下,记录一下其设计思想和难以理解的地方. shared_ptr是Boost里面最有价值的的智能指针.它封装了一个原生态指针和一个引用计数器,这个引用计数器是一个类shared_count.shared_ptr支持比较运算,重载了operator<,因此其可以用于set和map. 在转换shared_ptr指针时,用***_pointer_cast定义的函数

[Todo]Boost安装与学习

现在这里找下载包 http://sourceforge.net/projects/boost 我找的是 1_62_0 下面是从公司wiki上找到的一个说明. boost & thrift安装步骤 1. boost安装 cd /usr/local tar zxvf boost_1_49_0.tar.gz ./bootstrap.sh --prefix=/usr/local/boost_1_49_0 ./b2 install 2. thrift安装 tar zxvf thrift-0.8.0.tar