文章目录

  • 示例
  • std::tie函数
  • std::ignore
  • std::pair和std::tuple互转
  • 解包pair返回值

示例

这是http://www.cplusplus.com/reference/tuple/tie/?kw=tie中的一个std::tie()函数的示例。

#include <iostream>     // std::cout
#include <tuple>        // std::tuple, std::make_tuple, std::tieint main ()
{int myint;char mychar;std::tuple<int,float,char> mytuple;mytuple = std::make_tuple (10, 2.6, 'a');          // packing values into tuplestd::tie (myint, std::ignore, mychar) = mytuple;   // unpacking tuple into variablesstd::cout << "myint contains: " << myint << '\n';std::cout << "mychar contains: " << mychar << '\n';return 0;
}
myint contains: 10
mychar contains: a

std::tie函数

std::tie函数可以用于建立一个由reference构成的tuple,也可以用于tuple的解包。

可能的实现:

template <typename... Args>
auto tie(Args&... args) {return std::tuple<Args&...>(args...);
}

std::tie函数,将创建一个由reference构成的匿名tuple对象,并将其返回。

这里比较有意思的是,std::tie创建的匿名tuple对象,其内部通过引用和传入的参数想关联,随意一方的改动,对方可以感知,是同步的。

我们使用一个简单的示例模式一下,代码如下:

class A
{public:A(int& i):ri(i){}void set(int x){ri = x;}private:int & ri;
};int main()
{int i = 10;A a(i);a.set(20);cout<<"i = "<<i<<endl;return 0;
}
i = 20

通过传递变量的引用,使得在多处可以对同一个变量进行修改。

  std::tuple<int,float,char> mytuple;mytuple = std::make_tuple (10, 2.6, 'a');

先是使用默认构造器,创建mytuple对象。

使用make_tuple可以快速的创建tuple对象,同时make_tuple是一个模板参数,省去了指定参数的类型。

mytuple = std::make_tuple<int,float,char>(10,2.6,'a');

这样也是可以的

make_tuple将返回的tuple对象,赋值给mytuple,将发生一次赋值运算符重载。此后mytuple就保存了10,2.6,'a’这三个数据。

std::tie (myint, std::ignore, mychar) = mytuple;

tie将返回一个临时的匿名的tuple对象,这个tuple对象和myint、mychar变量通过引用进行关联,如果对这个临时匿名的tuple的修改,myint、mychar都可以感知。

mytuple将赋值给匿名的临时tuple对象,也就是mytuple中的值分别赋给了myint、std::ignore、mychar。

本行执行完毕,std::tie函数返回的临时对象就被销毁了。同时myint变为了10,mychar变为了’a’。

std::ignore

可能的实现

namespace detail {struct ignore_t {template <typename T>const ignore_t& operator=(const T&) const { return *this; }
};
}
const detail::ignore_t ignore;

std::ignores是detail::ignore_t类型的一个const类型的实例对象。detail::ignore_t类内部提供了模板类型operator=,任意类的对象都可以给它赋值,但它的赋值什么也不做,只是单纯的返回自己,所以所有给它的值相当于全部被忽略了。这里之所以返回*this是为了实现连等式。

std::tie (myint, std::ignore, mychar) = mytuple;

在执行tuple赋值运算符重载的时候,mytuple将第二个值赋值给了std::ignore对象,这导致上面函数的调用,但是由于这个函数什么不做,所以mytuple中的第二个值就被忽略了。

class A
{public:
};class B
{public:
};int main ()
{A a;B b;int i = 100;float f = 3.14;std::ignore = i;std::ignore = f;std::ignore = a;std::ignore = b;return 0;
}

任意类型的对象都可以赋值给ignore,但什么反应也不会有。

std::pair和std::tuple互转

可以使用一个pair作为初值,初始化一个双元素tuple,也可以将一个pair赋值给一个双元素tuple。

pair<int,string> studentPair(1001,"Bob");
tuple<int,string> studentTuple;studentTuple = studentPair;cout<<"id   = "<<get<0>(studentTuple)<<endl;
cout<<"name = "<<get<1>(studentTuple)<<endl;
id   = 1001
name = Bob

解包pair返回值

#include <iostream>
#include <tuple>
#include <set>int main ()
{set<int> si;bool inserted;std::tie(std::ignore,inserted) = si.insert(10);if(inserted){cout<<"Value was inserted successfully"<<endl;}//set中已经有了10,再次插入10,将失败。std::tie(std::ignore,inserted) = si.insert(10);if(!inserted){cout<<"Value was inserted failed"<<endl;}return 0;
}
Value was inserted successfully
Value was inserted failed

set成员函数insert的返回值是一个pair。pair.first返回插入位置的迭代器,pair.second表示是否插入成功。

现在通过std::tie函数只解包出是否插入成功。

窥视C++细节-使用tie函数解包pair对象的原理相关推荐

  1. std::tie 创建左值引用的 tuple,或将 tuple 解包为独立对象

    说明 std::tie : 创建左值引用的 tuple,或将 tuple 解包为独立对象 可以对std::tuple以及std::pair进行解包 返回值 含左值引用的 std::tuple 对象. ...

  2. Python的解包知识

      在Python中的代码中经常会见到 *args 和 **kwargs.args 是 arguments 的缩写,*args表示位置参数:kwargs 是 keyword arguments 的缩写 ...

  3. std::tie详解

    std::tie:创建左值引用的 tuple,或将 tuple 解包为独立对象 返回值 含左值引用的 std::tuple 对象. 注意 std::tie 可用于解包 std::pair ,因为 st ...

  4. python解包什么意思_python解包用法详解

    对于一堆资料,我们可以把它分给不同的人使用,这个分散的过程,我们可以看成是解包方法是实现.当然实际python解包的使用会相对复杂一点,我们会对常见的列表.函数等进行操作.下面我们就Python解包的 ...

  5. python解包操作_python解包如何使用?

    对于一堆资料,我们可以把它分给不同的人使用,这个分散的过程,我们可以看成是解包方法是实现.当然实际python解包的使用会相对复杂一点,我们会对常见的列表.函数等进行操作.下面我们就Python解包的 ...

  6. python-装包与解包

    装包与解包的理解:[装包]就是把未命名的参数放到元组中,把命名参数放到字典中[拆包]将一个结构中的数据拆分为多个单独变量中 *args **kwargs python 数据类型可以装包拆包:      ...

  7. 一款游戏资源解包工具的开发始末

    来自 <http://www.jybase.net/ruanjianpojie/20120311795_5.html> 时间:2012-03-11 21:59来源:未知 整理:寂涯网络 点 ...

  8. Python之可变参数,*参数,**参数,以及传入*参数,**参数解包,*args,**kwargs的理解

    前言 *参数与**参数是Python参数中的重点知识,他们都被称为可变参数(任意参数),我们经常会在代码中看到*args.**kwargs 作为函数定义时: 1.*参数收集所有未匹配的位置参数组成一个 ...

  9. python总结(数据类型、逻辑控制、函数、类与对象、推导式、解包、类型转换、异常、上下文、jsonpath、定时器)

    pthon总结 1.python 3种基本数据类型 2.python 字典 3.python 列表 4.python 集合 5.python 字符串 6.python 元组 7.python 运算符( ...

最新文章

  1. sense chrome扩展工具安装问题
  2. 改善程序的55个具体做法
  3. VTK:vtkCaptionWidget用法实战
  4. C语言调用WIN32 API学习之6鼠标与键盘响应
  5. SAP JAM的推荐菜单,书签和日历功能
  6. excel按季度分类汇总_Excel数据分析实战(1)--电商销售记录分析
  7. 调整灰度图像的大小,而无需在Python中使用任何内置函数
  8. 中国移动云能力中心 高薪诚聘各路运维技术专家
  9. 串口发送字符串到串口软件
  10. 使用二分查询数组中的某一个元素,简单示例,详细注解
  11. python之调用科大讯飞的在线语音识别
  12. ElmentUI数据表格 序号
  13. ajax异步提示对号,jQuery Ajax显示对号和错号用于验证输入验证码是否正确
  14. 吊打何同学?B 站 UP 主 24 小时肝出 AirDesk 平替,成本 6000!
  15. 超微服务器主板ipmi证书,超微服务器主板ipmi怎样恢复出厂设置
  16. 列表推导式写99乘法表
  17. 使用Matlab实现:Jacobi、Gauss-Seidel迭代
  18. Sentinel Dashboard轻松流控
  19. psv摇杆测试软件,adrenaline专用右摇杆控制视角插件发布, 转
  20. Runtime Error可能产生的原因

热门文章

  1. 2-9课:树和图的现实意义、区别与联系
  2. 前端国际化如何对中文——>英文自动化翻译小demo
  3. 烘焙门店 | 解锁公众号精准引流5W+的流量密码
  4. 【转摘】未来财务会是什么样子?
  5. 汽车电子学习笔记—AutoSAR之基础软件层(BSW)
  6. 我们不仅仅做软件 云工作台+ 聚合·共享
  7. 【Matlab WSN通信】A_Star改进LEACH多跳传输协议【含源码 487期】
  8. 高校俱乐部发福利啦,晚了就没了,速度~
  9. P2P技术详解(一):NAT详解——详细原理、P2P简介
  10. 张生情迷崔莺莺,襄王意欲会神女——新说莺莺传之二