c++26新功能—结构化绑定的扩展

一、结构化绑定

在C++17中,结构化绑定给开发者带来极大的方便性,特别是针对类似std::tuple这类容器以及在使用auto解构相关对象时,更是让代码看上去清爽、易读。在前面的文章中,对结构化绑定也进行了不少的分析说明和实例解释。这里不再重复的说明了。
另外,老程序都知道,早期的for语句,循环索引变量(类似for (int i =0; )是可以在循环外定义的。但随着标准的演进,整体统一到了for循环中。同样,在C++17中为了简化编程的流程,在if和switch中也可以使用初始化语句,它既可以是表达式也可以是变量,形如:

if (init; conditional){} else{}
switch (init; conditional) {}

它的展开形式大家应该非常清楚,即使没有说明,大概也可以猜测得到,而且猜测应该是对的,即其展开形式为:

init;
if (cond){}else{}

init;
switch(cond){}

那么大家是不是想到了什么?

二、C++26中对结构化绑定的扩展

正如上面所描述,C++26中提供了在if和switch语句中,增加了对结构化绑定的支持,即可以在这两个语句中使用auto语句进行自动的解构相关的容器和对象。这样进一步扩展了C++17中的对这两种语句的支持。
C++26的结构化绑定中,对结构化绑定进行了更强的支持,一个是可支持更细粒度的控制,如增加对象的属性解析;在模板中支持可变参数解构等,类似下面的这些代码:

auto [a,b[[maybe_unused]]] = c;
auto [...t] = x;

是不是有一种路越走越宽的感觉,有这种感觉就对了。

三、例程

看一下相关的例程:

#include <charconv>
#include <cstring>
#include <iostream>
 
void parseData(char* buf) {
    if (auto [ptr, ec] = std::to_chars(buf, buf + std::strlen(buf), 100); ec == std::errc()) {
        std::cout << "is ok!"<<std::endl;
    } else {
        std::cerr <<std::make_error_code(ec).message()<<",err:"<<buf<<std::endl;
    }
}
 
int main() {
    const char* buf = "100";
    parseData(buf);  
    return 0;
}

因为只是扩展应用,所以例程就非常简单了,有了前面铺垫,大家应该很就会明白并且很容易在实际开发中进行应用。

四、总结

大家不要认为简单的东西就没啥意思,其实越是这种基础的简单的扩展,反而更容易让人体会到C++标准演进的意义。一些所谓高深的技术的引入,往往让开发者有一种学习一门新技术的感觉,从相当程度上会劝退大部分的开发者,这样,就难免影响其在实际的开发中的应用了。
任何标准的推进,都是一种思想上的扩展,大家只要从制定标准的角度去理解这些内容,就会更容易把握它们的意义。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值