









在C++17这一个里程碑式的版本中,引入了结构化绑定structured binding
结构化绑定structured binding => 结构化绑定允许将一个复合数据类型(如 tuple, pair,map或struct)的多个元素直接绑定到单独的变量上,而无需逐一访问. 结构化绑定在编译期间完成,提供了类型安全和更好的性能
在C++17之前,我们如果需要从函数返回多个值,可以使用tuple,然后用std:tie来获取
std::tuple<int,char,bool> GetTupleValues() { int x = 1; char y = 'b'; bool z = true; return std::make_tuple(x,y,z); } int main() { int a; char b; bool c; std::tie(a,b,c) = GetTupleValues();
return 1; }
可以看到,我们用std::tie时,需要已经知道GetTupleValues()返回的每一项分别是什么类型的数据 => 我们定义的a,b,c的类型必须和返回的tuple中的每项类型一一对应.
如果使用C++17中引入的结构化绑定structured binding呢,我们可以直接这样写
auto [a, b, c] = GetTupleValues();
结构化绑定中使用const和&
当绑定到非临时对象时,考虑是否需要引用或常量引用,以避免不必要的拷贝或修改原对象。
#include <iostream> #include <tuple> int main() { std::tuple<int, std::string> myTuple = {1,"Test"};
const auto& [id,name] = myTuple; //结构化绑定中使用常量引用
std::cout << "id is " << id << " and name is " << name << std::endl; }
我们来写一个复杂的例子,来更好的理解数据化绑定
#include <iostream> #include <tuple> #include <string> struct Address { std::string street; std::string city; }; struct Person { std::string name; int age; Address addr; }; int main() { Person Luke{"Luke Wu", 35, {"Jianguomen St.", "Beijing"}}; // 直接解构Person auto &[name, age, addr] = Luke; std::cout << "Name: " << name << ", Age: " << age << '\n'; // 解构嵌套的Address auto &[street, city] = addr; std::cout << "Lives at " << street << ", " << city << '\n'; // 结构化绑定与元组一起使用 std::tuple<int, std::string, double> info{Luke.age, Luke.name, 165.5}; auto &[ageRef, nameRef, height] = info; std::cout << "Age ref: " << ageRef << ", Name ref: " << nameRef << ", Height: " << height << '\n'; return 0; }
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。