当前位置: 首页 > news >正文

C++26新特性解读: 结构化绑定作为条件

C++17 引入了结构化绑定用来声明变量, 到现在为止它能出现在if/while/for等语句中.
P0963提议了新的语法增强, 允许结构化绑定作为条件使用, 这将简化代码写法.

通常在if中声明变量时, 我们会进一步对变量做判断, 比如:

#include <charconv>
#include <print>

struct parse_result {
  long result;
  const char* begin;
  const char* end;
};

parse_result parse(const char* begin, const char* end) {
  char* last;
  auto ret = strtoll(begin, &last, 10);
  return {ret, last, end};
}

int main() {
  std::string_view str = "123 456 789";
  auto begin = str.data();
  auto end = str.data() + str.size();
//{
  if (auto [ret, first, last] = parse(begin, end);
     first != last) {
    // interpret [first, last) into a value
    std::println("ok, got {}", ret);
  }
//}
}

first != last是分支判断条件, 它具有重复性. 我们可以重载操作符(), 返回布尔值, 从而在if中调用.

struct parse_result {
  long result;
  const char* begin;
  const char* end;

  explicit operator bool() const noexcept {
    std::println("operator () called");
    return begin != end;
  }
};

之前的代码就可以简化为:

#include <charconv>
#include <print>

struct parse_result {
  long result;
  const char* begin;
  const char* end;

  explicit operator bool() const noexcept {
    std::println("operator () called");
    return begin != end;
  }
};

parse_result parse(const char* begin, const char* end) {
  char* last;
  auto ret = strtoll(begin, &last, 10);
  return {ret, last, end};
}

int main() {
  std::string_view str = "123 456 789";
  auto begin = str.data();
  auto end = str.data() + str.size();
//{
  if (auto [ret, first, last] = parse(begin, end)) {
    // interpret [first, last) into a value
    std::println("ok, got {}", ret);
  }
//}
  return 0;
}

对于标准库中已经实现类似功能的接口(std::from_chars/std::to_chars), 我们就可以利用它来简化代码:

#include <charconv>
#include <iostream>

int main() {
  char buffer[16];
  char* p = buffer;
  char* last = buffer + sizeof(buffer);

  // before C++26
  if (auto result = std::to_chars(p, last, 42)) {
    auto [ptr, _] = result;
    // okay to proceed
  } else {
    auto [ptr, ec] = result;
    // handle errors
  }

  // C++26
  if (auto [ptr, ec] = std::to_chars(p, last, 42)) {
    // okay to proceed
  } else {
    // handle errors
  }
  return 0;
}

进一步阅读

  • C++26 新特性预览(Preview)
    • 契约(Contract)
    • C++26 编译时反射简介
    • C++26 占位符变量改进

相关文章:

  • 在linux中GCC、Yum 与 Apt - get 的区别
  • OCRmyPDF 开源核弹
  • PyCharm 下载与安装教程:从零开始搭建你的 Python 开发环境
  • 【江协科技STM32】PWR电源控制(学习笔记)
  • 排序算法-插入排序
  • Tomcat深度解析:Java Web服务的核心引擎
  • Java 线程池与 Kotlin 协程 高阶学习
  • 子网划分2
  • OSPF五种数据包详解
  • FPGA实现LED流水灯
  • Leetcode 3500. Minimum Cost to Divide Array Into Subarrays
  • Spring IOC:容器管理与依赖注入秘籍
  • RK3568 pinctrl内容讲解
  • Python----机器学习(距离计算方式:欧式距离,曼哈顿距离,切比雪夫距离,余弦相似度,汉明距离,闵可夫斯基距离,Jaccard指数,半正矢距离)
  • 探索PHP的未来发展与应用趋势
  • Java面试黄金宝典27
  • transformer架构与其它架构对比
  • K8S学习之基础六十六:Rancher部署
  • Kafka延迟队列实现分级重试
  • 在eclipse中通过git放弃某个版本之前所有的更新
  • 猎金,游戏,诚不我欺
  • 澎湃读报丨解放日报8个版聚焦:牢记嘱托,砥砺奋进
  • 夜读丨春天要去动物园
  • 中国武术协会原主席张耀庭逝世,曾促成电影《少林寺》拍摄
  • 量子传感新技术“攻克”退相干难题
  • 陈文清:推进扫黑除恶常态化走深走实,有力回应人民群众对安居乐业的新期待