什么是结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
如何使用
使用结构化绑定比较简单,在声明变量时使用auto关键字和&符号,并用{}包含聚合类型的各个成员即可。其中,&符号为可选,表示引用。
首先,我们来看一下绑定元组的情况。在下面的示例代码中,我们通过std::make_tuple创建了一个包含人员信息的元组,并使用结构化绑定一次性解包为name、age两个变量。通过这种方式,数据访问变得简洁而高效。
int main() { // 绑定到元组 auto person = std::make_tuple("Mike", 18); const auto& [name, age] = person; std::cout << "Name: " << name << ", Age: " << age << std::endl; return 0; }
接下来,我们学习下绑定数组和结构体的情况。在下面的示例代码中,我们将数组pnNumber赋值给对应的变量a、b和c,同时将结构体person赋值给对应的变量name和age。
struct TPersonInfo { std::string name; int age; }; int main() { // 绑定到数组 int pnNumber[] = {66, 77, 88}; auto [a, b, c] = pnNumber; std::cout << a << ", " << b << ", " << c << std::endl; // 绑定到结构体 TPersonInfo person{"Jack", 25}; auto& [name, age] = person; std::cout << "Name: " << name << ", Age: " << age << std::endl; return 0; }
除了上面介绍的这些,结构化绑定还支持直接绑定到匿名元组、匿名结构体和匿名联合。在下面的示例代码中,我们使用lambda表达式创建了一个临时的元组,并通过结构化绑定到匿名变量a和b上,避免了额外的变量声明。
int main() { // 绑定到匿名元组 auto [a, b] = []{ return std::make_tuple(66, 99); }(); std::cout << a << ", " << b << std::endl; return 0; }
注意事项
1、结构化绑定只能用于聚合类型,不能用于基本数据类型。
2、结构化绑定的变量是只读的,不能通过它们来修改原始数据。如果确实需要修改原始数据,可以使用引用或直接访问原始数据。
3、绑定顺序必须与聚合类型中元素的声明顺序保持一致。
4、如果不关心聚合类型中的某些成员,可以使用下划线_占位符来忽略不需要的成员。