Structured Binding in C++

Last Updated: 2024-01-02 11:09:40 Tuesday

-- TOC --

Python用得爽,有个原因是,函数可以随便返回多少个不同的对象,解释器自动将它们pack为tuple,在caller处直接unpack,极其细滑。其实,现代C++也可以这么干!示例如下:

#include <iostream>
#include <string>
using namespace std;

struct xyz{
    int a;
    char b;
    string s;
};

xyz func(void){
    int a{1};
    char b{'b'};
    string s{"1234567890"};
    return {a,b,s};
}

int main(void) {
    // auto [a,b,s] = func();
    auto [a,b,s] { func() };  // better
    cout << a << b << s << endl;
    return 0;
}

func函数返回一个struct结构体数据,main中的这行代码auto [a,b,s] { func() },就是Structured Binding,将struct结构体内的member分别解析出来,用另一个变量binding。(Structured Binding从C++17开始)

其实,上面的C++代码还是冗余了,因为专门定义了一个struct结构体,好麻烦呀......现代C++可以使用tuple模版,去掉这个冗余,请看代码:

#include <iostream>
#include <string>
#include <tuple>
using namespace std;

tuple<int,char,string> func(void) {
    return {1, 'b', "1234567890"};
}

int main(void) {
    auto [a,b,s] { func() };
    cout << a << b << s << endl;
    return 0;
}

好简洁好优雅...这让我对现代C++又多了几分好感...anyway,我们一般不会设计函数直接返回一个结构体,实际上,structured binding是更直接的一个概念:

#include <iostream>
#include <string>
#include <tuple>
using namespace std;

int main(void) {
    tuple<int,int,string> x { 1,2,"abc"s };
    auto [a,b,s] { x } ;
    cout << a << b << s << endl;
    return 0;
}

在Range-based for loop场景,也可以直接应用structured binding:

#include <iostream>
#include <unordered_map>
using namespace std;

int main(){
    unordered_map<string,string> udict;
    udict.emplace("111","abc");
    udict.emplace("222","bbb");
    udict.emplace("333","ccc");
    for(auto &[k,v]: udict)
        cout << k << " " << v << endl;
    /*for(auto &n: udict)
        cout << n.first << " " << n.second << endl;*/
    return 0;
}

&[k,v]表示已引用的方式得到udict中的对象。

本文链接:https://cs.pynote.net/sf/c/cpp/202211031/

-- EOF --

-- MORE --