题目

编写程序,演示 C++17 核心特性“结构化绑定”(Structured Binding)。分别对原生数组、自定义 POD 结构体以及标准库多元组 std::tuple 和 std::pair 执行一次性就地解构绑定;比对值拷贝解构、const auto& 常引用解构与 auto& 非常引用就地修改对原对象的影响。

输入格式:无需外部输入。

输出格式:输出解构变量的值以及就地修改后的原始容器状态。

数据范围与约定:C++17 语法糖与解构求值。

思路与算法

1. 结构化绑定的底层机制
结构化绑定 auto [a, b] = obj; 并非分别定义两个独立变量,而是由编译器在背后引入一个隐式的匿名对象拷贝或引用,随后将 a 和 b 映射为该隐式对象的成员别名。

2. 引用解构的就地修改能力
使用 auto& [id, name, score] = student; 可以获得直观的可修改左值别名,对成员的修改直接穿透同步到源结构体。

3. 与 std::tie 的代际对比
在 C++17 之前需要预先声明所有变量再用 std::tie(a, b) = tup; 进行解构;结构化绑定实现了“声明即解构”,彻底消除了临时无意义默认变量的冗余声明。

完整程序

#include <iostream>
#include <tuple>
#include <string>

struct Employee {
    int id;
    std::string name;
    double salary;
};

std::tuple<std::string, int, bool> getSystemStatus() {
    return {"Server-Alpha", 200, true};
}

int main() {
    // 1. 解构自定义结构体(引用绑定)
    Employee emp{101, "张三", 15000.50};
    auto& [eId, eName, eSalary] = emp;

    std::cout << "--- 1. 结构体引用解构与就地加薪 ---\n";
    std::cout << "工号: " << eId << ", 姓名: " << eName << ", 薪资: " << eSalary << "\n";
    eSalary += 3000.0; // 穿透修改
    std::cout << "通过绑定修改后原结构体薪资: " << emp.salary << "\n\n";

    // 2. 解构多元组 std::tuple(值解构)
    auto [node, code, isOnline] = getSystemStatus();
    std::cout << "--- 2. 多元组解构服务状态 ---\n";
    std::cout << "节点: " << node << "\n";
    std::cout << "响应码: " << code << "\n";
    std::cout << "在线状态: " << (isOnline ? "正常运转" : "离线告警") << "\n\n";

    // 3. 解构原生数组
    int coords[3] = {1920, 1080, 60};
    auto [width, height, fps] = coords;
    std::cout << "--- 3. 原生数组解构 ---\n";
    std::cout << "分辨率: " << width << "x" << height << " @" << fps << "Hz\n";

    return 0;
}

运行示例

输出:

--- 1. 结构体引用解构与就地加薪 ---
工号: 101, 姓名: 张三, 薪资: 15000.5
通过绑定修改后原结构体薪资: 18000.5

--- 2. 多元组解构服务状态 ---
节点: Server-Alpha
响应码: 200
在线状态: 正常运转

--- 3. 原生数组解构 ---
分辨率: 1920x1080 @60Hz