首页 > 编程语言 >C++17: 结构化绑定(Structured Bindings)

C++17: 结构化绑定(Structured Bindings)

时间:2024-03-29 13:57:14浏览次数:25  
标签:std name 17 tuple int Structured C++ CreatePerson get

遇到有时候写函数需要返回多个值的情况。

C++17之前,只能事先定义一个结构体, 然后返回这个结构体类型就可以了。

但是如果你的这个结构体类型只在这个这里用一次呢。

你还要抠脑壳想一个合适的结构体名字,麻烦!

std::tuple

C++11引入了一个新的类模板叫std::tuple,

是一个容器, 可以存储多个不同类型的值。

#include <iostream>
#include <string>
#include <tuple>
 
// 只需填类型, 不用像定义结构体那样需要命名成员变量
// BTW, 这种两个成员的其实也可以用std::pair, 但是不具备一般性
// 如果哪天要增加成员, 还得改变类型成tuple
// 直接写tuple, 一劳永逸, 可变性也要好些, 方便改动
std::tuple<std::string, int> CreatePerson()
{
    return { "小岛秀夫赛高", 56 };  
}
 
int main()
{
    auto person = CreatePerson();
    
    // 通过工具函数get访问uple各元素, 下标 0 代表tuple得第一个元素, 依次得到对应元素.
    std::string &name = std::get<0>(person);   
    int age = std::get<1>(person);
    
    std::cout << name << " " << age << "\n";
}

但是,这样做华而不实 —— 虽然不用事先定义结构体了,看似简洁了。

但是啊,这个get函数长得也太奇怪了,直白点就是好丑啊,0 1 2这种下标看着就够恶心的了。

先用tie改进一下

std::tuple<std::string, int> CreatePerson()
{
    return { "小岛秀夫赛高", 56 };
}
 
int main()
{
    std::string name;
    int age;
    
    // 依次绑定tuple中的元素到对应变量, 给get 0 1 2 3 说拜拜了
    std::tie(name, age) = CreatePerson();
    std::cout << name << " " << age << "\n";
}

的确比之前简洁许多了。

但是啊,还是要用三行代码啊。

我之前用结构体类型的变量person,通过 '.' 成员访问运算符访问比这个使用起来简洁多了。

结构化绑定

std::tuple<std::string, int> CreatePerson()
{
    return { "小岛秀夫赛高", 56 };
}
 
int main()
{
    // 不用多说了把 形如这样auto然后方括号里面依次写对应的变量名
    // 自行体会其中的妙处 嘿嘿嘿
    auto[name, age] = CreatePerson();
    std::cout << name << " " << age << "\n";
}

这个时候它的作用就体现出来了, 就是为了满足让你能把代码写的足够简洁的需求的!

最后

如果多个返回值的组合是经常到处被用到, 可能还是结构体好些哈, 别学了新的就忘了旧的, 为了新而新就不好了

标签:std,name,17,tuple,int,Structured,C++,CreatePerson,get
From: https://www.cnblogs.com/AbendEssen29/p/18103703

相关文章

  • 《责任链模式(极简c++)》
            本文章属于专栏-概述-《设计模式(极简c++版)》-CSDN博客模式说明方案:责任链模式将请求的发送者和接收者解耦,构成一个链条,并由多个对象对请求进行处理,直到找到合适的处理者为止。优点:实现了请求发送者和接收者的解耦,灵活性高,易于扩展,每个处理者只需关注自......
  • 《代理模式(极简c++)》
            本文章属于专栏-概述-《设计模式(极简c++版)》-CSDN博客模式说明方案:代理模式充当了客户端和实际对象之间的中介,通过引入代理对象来控制对原始对象的访问。优点:通过代理,可以实现对目标对象的控制,提供更多的功能,例如延迟加载、访问控制、日志记录等。缺点......
  • 【洛谷 P8654】[蓝桥杯 2017 国 C] 合根植物 题解(并查集)
    [蓝桥杯2017国C]合根植物题目描述w星球的一个种植园,被分成m×nm\timesnm×n个小格子(东西方向......
  • 转载:使用 Linux tracepoint、perf 和 eBPF 跟踪数据包 (2017)
    http://arthurchiao.art/blog/trace-packet-with-tracepoint-perf-ebpf-zh/Linux允许在主机上用虚拟网卡(virtualinterface)和网络命名空间(networknamespace)构建复杂的网络。但出现故障时,排障(troubleshooting)相当痛苦。如果是3层路由问题,mtr 可以排上用场;但如果是更底层的问......
  • MD5 计算 (下一代加密辅助类, Win32, C++)
    CCNGHelper.h#pragmaonce#include<string>#include<tchar.h>#include<windows.h>#include<bcrypt.h>#ifdef_UNICODEusing_tstring=std::wstring;#elseusing_tstring=std::string;#endif//下一代加密辅助类//客户端:WindowsVista及......
  • 017、夏日南亭怀辛大
    017、夏日南亭怀辛大唐●孟浩然山光忽西落,池月渐东上。散发乘夕凉,开轩卧闲敞。荷风送香气,竹露滴清响。欲取鸣琴弹,恨无知音赏。感此怀故人,中宵劳梦想。 【现代诗意译】南亭夏日想念辛大老友 山上的夕阳余光向西徐徐落下,池塘上明月慢慢从东方升起。 我披散着头发在......
  • c++ string
     字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种,一种来自C语言,常被称为C-风格字符串,另一种是基于string类库的字符串处理方式。C风格字符串的处理可以参考 https://www.cnblogs.com/tongye/p/10688941.html ,本文着重介绍string类库的使用。......
  • C++学习笔记——007
    注意,int*pt;中pt是int值的地址并不意味着pt本身的类型是int。例如,在有些平台中,int类型是个2字节值,而地址是个4字节值。 对于指针,需要指出的另一点是,new分配的内存块通常与常规变量声明分配的内存块不同。常规变量的值都存储在被称为栈(stack)的内存区域中,而new从被称为堆(he......
  • C++学习笔记——006
    事实上,任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。因此,下面所有的输出语句都是等效的:cout<<"I'dgivemyrightarmtobe""agreatviolinist.\n";cout<<"I'dgivemyrightarmtobeagreatviolinist.\n";cout<<&qu......
  • lanqiao106. 正则问题 (第八届蓝桥杯C++A组)或者 acwing 1225. 正则问题
    问题:知识补充:1. 正则表达式的计算①括号代表优先计算,②或符号代表二选一。比如给的例子:((xx|xxx)x|(x|xx))xx 2. 字符串的语法问题:string是字符串的类型,使用的时候也使像字符一样使用,加入定义stringstr,那么使用的时候要写成str[]思考:妈呀一开始我不会算正则表达......