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 --