专业的编程技术博客社区

网站首页 > 博客文章 正文

C++ 20新特性之结构化绑定(c++结构类型定义)

baijin 2024-08-13 00:55:39 博客文章 4 ℃ 0 评论

如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

什么是结构化绑定

在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。


如何使用

使用结构化绑定比较简单,在声明变量时使用auto关键字和&符号,并用{}包含聚合类型的各个成员即可。其中,&符号为可选,表示引用。

首先,我们来看一下绑定元组的情况。在下面的示例代码中,我们通过std::make_tuple创建了一个包含人员信息的元组,并使用结构化绑定一次性解包为name、age两个变量。通过这种方式,数据访问变得简洁而高效。

#include <iostream>
#include <tuple>

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。

#include <iostream>
#include <string>

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上,避免了额外的变量声明。

#include <iostream>

int main()
{
    // 绑定到匿名元组
    auto [a, b] = []{ return std::make_tuple(66, 99); }();
    std::cout << a << ", " << b << std::endl;
    return 0;
}


注意事项

1、结构化绑定只能用于聚合类型,不能用于基本数据类型。

2、结构化绑定的变量是只读的,不能通过它们来修改原始数据。如果确实需要修改原始数据,可以使用引用或直接访问原始数据。

3、绑定顺序必须与聚合类型中元素的声明顺序保持一致。

4、如果不关心聚合类型中的某些成员,可以使用下划线_占位符来忽略不需要的成员。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表