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

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

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";
}

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

最后

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

posted @ 2024-03-29 13:47  AbendEssen29  阅读(16)  评论(0编辑  收藏  举报