author: hjjdebug
date: 2025年 05月 28日 星期三 15:57:58 CST
descrip: c++结构化绑定:
结构化绑定:
名称辨析: 名称叫绑定好还是叫解绑好?
解绑意思是原来是一个整体,现在被分成了若干个部分,所以叫解.
绑定强调的意思是. 被分解的某个变量,绑定到了整体的某个变量上. 做为整体的对象没有被分解.
按照大家的认识,还是叫结构化绑定比较好.
-
目的: 结构化绑定是C++17引入的特性,用于简化聚合类型的数据解构操作,
-
操作对象:结构化绑定允许开发者通过单个声明(一行代码)
将复合数据对象 (如std::tuple、数组、结构体)的成员直接解构至独立的变量. -
实现原理: 其本质是编译器自动生成对聚合类型成员的匿名引用或拷贝
结构化绑定主要用于访问公开成员,要访问私有成员需要结合其他技术手段
测试代码:
$ cat main.cpp
#include <iostream>
#include <tuple>
#include <map>
class Point
{
public:Point(int x,int y,int z):_x(x),_y(y),_z(z){}
public:int _x,_y,_z; //如果是私有成员,需要结合其他技术手段
};//结构化绑定实例,
int main()
{//结构体解构, 用单个的变量绑定到结构的成员变量上.Point p{3, 5, 8};auto [i1, i2, i3] = p; std::cout << "i1/i2/i3: " << i1 << ' ' << i2 << ' ' << i3 << '\n';//数组解包, 用单个变量,绑定到数组的元素上.int arr[3] = {10, 20, 30};auto [a, b, c] = arr; std::cout<<"a/b/c:" << a << ' ' << b << ' ' <<c <<'\n';//元组解包, 用单个变量去绑定元组中各个元素std::tuple<int, std::string, float> data{42, "text", 1.2f};auto [num, str, val] = data; std::cout<<"num/str/val:" << num << ' ' << str << ' ' <<val <<'\n';//遍历关联容器std::map<std::string, int> m{{"a",1}, {"b",2}};for (const auto& [key, value] : m) { // 把map容器对象直接解构到键值对变量.std::cout << key << ":" << value << "|";}std::cout<<'\n';return 0;
}
执行结果:
$ ./tt
i1/i2/i3: 3 5 8
a/b/c:10 20 30
num/str/val:42 text 1.2
a:1|b:2|