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

C++26 新特性预览(Preview)

文章目录

    • 1. 静态反射 (Static Reflection)
      • 示例: 枚举转字符串
      • 应用场景
    • 2. 合约 (Contracts)
      • 示例: 定义函数合约
      • 应用场景
    • 3. 条件中的结构化绑定 (Structured Bindings in Conditions)
      • 示例: 改进的错误处理
      • 应用场景
    • 4. 包索引 (Pack Indexing)
      • 示例: 获取参数包的第一个和最后一个元素
      • 应用场景
    • 5. 饱和算术 (Saturation Arithmetic)
      • 示例: 安全算术操作
      • 应用场景
    • 6. 为函数`delete`标记添加说明
      • 应用场景
    • 7. 匿名占位符的改进
    • 8. 用户自定义 `static_assert` 错误信息
    • 9. 为花括号初始化的内容提供静态存储支持
    • 10. 新的头文件`<debugging>`
    • 总结

C++26 引入了一系列新功能, 进一步提升了语言的灵活性, 性能和易用性. 本文将列举其中的一些新特性, 并通过代码示例帮助您快速掌握.


1. 静态反射 (Static Reflection)

静态反射允许开发者在编译时查询和操作类型信息, 为元编程提供了强大的支持. 这一特性极大地简化了类型处理, 自动生成代码等复杂任务.

示例: 枚举转字符串

#include <experimental/meta>
#include <iostream>
#include <string>
#include <type_traits>template <typename E>requires std::is_enum_v<E>
constexpr std::string enum_to_string(E value) {std::string result = "<unnamed>";[:expand(std::meta::enumerators_of(^E)):] >> [&]<auto e> {if (value == [:e:]) {result = std::meta::identifier_of(e);}};return result;
}enum Color { red, green, blue };
static_assert(enum_to_string(Color::red) == "red");
static_assert(enum_to_string(Color(42)) == "<unnamed>");int main() {Color red = Color::red;std::cout << enum_to_string(red) << std::endl;return 0;
}

应用场景

  • 类型描述自动生成: 通过反射轻松提取类型信息.
  • 代码生成工具: 基于反射实现自动代码生成和序列化.
  • 复杂元编程: 减少模板代码的复杂性.

2. 合约 (Contracts)

合约为函数定义前置条件, 后置条件和断言, 提升代码的可靠性.

示例: 定义函数合约

#include <contracts> // 合约支持的头文件int divide(int numerator, int denominator)pre (denominator != 0)                   // 前置条件: 分母不能为 0post (result: result * denominator == numerator) // 后置条件: 结果 * 分母 == 分子
{contract_assert(numerator >= 0);         // 断言: 分子必须是非负数return numerator / denominator;
}

应用场景

  • 输入验证: 确保函数调用的参数满足预期.
  • 逻辑验证: 自动检测计算结果是否符合约定.
  • 调试工具: 通过断言捕捉潜在的逻辑错误.

注意: 此功能目前仍需特定编译器支持.


3. 条件中的结构化绑定 (Structured Bindings in Conditions)

C++26 引入了在 ifwhile 条件语句中使用结构化绑定的能力, 进一步简化了错误处理流程.

示例: 改进的错误处理

#include <charconv>
#include <cstring>
#include <iostream>void parse_int(char* str) {if (auto [ptr, ec] = std::to_chars(str, str + std::strlen(str), 42);ec == std::errc{}) {std::cout << "Parsed successfully.\n";} else {std::cerr << "Failed to parse: " << str << "\n";}
}int main() {const char* buffer = "42";parse_int(buffer);  // 输出: Parsed successfully.return 0;
}

在 Compiler Explorer 中查看示例

应用场景

  • 简化异常处理: 在条件语句中直接解构返回值.
  • 提高可读性: 通过解构直接获取多个结果.

4. 包索引 (Pack Indexing)

包索引让开发者能直接访问模板参数包中的特定元素, 简化模板编程.

示例: 获取参数包的第一个和最后一个元素

#include <iostream>
#include <tuple>template <typename... Args>
constexpr auto first_and_last(Args... args) {return std::make_pair(Args...[0], Args...[sizeof...(Args) - 1]);
}int main() {auto [first, last] = first_and_last(1, 2, 3, 4, 5);std::cout << "First: " << first << ", Last: " << last << "\n";return 0;
}

注意: 当前示例基于提案实现, 需等待特定编译器支持.

应用场景

  • 元组操作: 直接访问和操作元组中的特定元素.
  • 参数解包: 在模板编程中高效地解包和处理参数包.
  • 代码生成: 简化生成代码时对参数包的处理.
  • 编译时计算: 在编译时对参数包进行索引和计算, 提高编译期的灵活性.
  • 容器操作: 在自定义容器中高效地访问和操作元素.

5. 饱和算术 (Saturation Arithmetic)

饱和算术为加减乘除提供安全操作, 避免溢出.

示例: 安全算术操作

#include <iostream>
#include <numeric>  // 包含饱和算术的定义int main() {// 饱和加法int add_result = std::add_sat<signed char>(100, 30);std::cout << "Saturated Add: " << add_result << "\n";  // 输出: 127// 饱和减法int sub_result = std::sub_sat<signed char>(-100, 30);std::cout << "Saturated Sub: " << sub_result << "\n";  // 输出: -128// 饱和乘法int mul_result = std::mul_sat<signed char>(100, 30);std::cout << "Saturated Mul: " << mul_result << "\n";  // 输出: 127// 类型转换的饱和long large_value = 150;int saturated_cast_result = std::saturate_cast<signed char>(large_value);std::cout << "Saturated Cast: " << saturated_cast_result<< "\n";  // 输出: 127return 0;
}

在 Compiler Explorer 中打开

应用场景

  • 图像处理: 确保像素值在合法范围内(如 0-255).
  • 嵌入式系统: 防止溢出带来的意外行为.

6. 为函数delete标记添加说明

通过为delete标记添加说明, 开发者能更清晰地了解函数为何被删除.

#include <functional>void NewAPI();
void OldAPI() = delete("OldAPI() is outdated and been removed - use NewAPI().");template <class T>
auto cref(const T&) -> std::reference_wrapper<const T>;template <class T>
auto cref(const T&&) = delete("cref(rvalue) is dangerous!");int main() {int i = 0;auto r1 = std::cref(i);   // OKauto r2 = std::cref(42);  // Error, best match is deletedreturn 0;
}

在 Compiler Explorer 中打开

参考这篇博客:What =delete means

应用场景

  • API 更新: 清晰地标记过时的函数, 引导用户使用新的 API.
  • 安全性: 阻止危险的函数调用, 提高代码的安全性.

7. 匿名占位符的改进

#include <tuple>[[nodiscard]] int foo() { return 0; }[[nodiscard]] std::tuple<int, int, double> tuple() { return {0, 1, 1.0}; }int multi() {auto _ = 1;                  // OKauto _ = 2.0;                // OK, no conflictauto _ = "string";           // OK, no conflictauto [ret, _, _] = tuple();  // OK, no conflict// return _; // Error, `_` has multi definitionreturn ret;
}int main() {// before C++26[[maybe_unused]] int a = foo();  // OKstd::ignore = foo();             // OKstatic_cast<void>(foo());        // Not recommended// from C++26auto _ = foo();auto _ = multi();auto [ret, _, _] = tuple();return ret;
}

在 Compiler Explorer 中打开

8. 用户自定义 static_assert 错误信息

#include <format>template <typename T>
void test_fun(T a) {static_assert(sizeof(T) == 1,std::format("Unexpected sizeof: expect 1, got {}", sizeof(T)));
}int main() {test_fun('c');  // OK// test_fun(1);    // error
}

在 Compiler Explorer 中打开

9. 为花括号初始化的内容提供静态存储支持

std::vector<char> v = {#embed "2mb-image.png"
};

这段代码中的 #embed 指令可以让大型文件的数据在编译时直接嵌入为静态存储的一部分, 从而提高加载效率.

10. 新的头文件<debugging>

#include <debugging>
int main() {std::breakpoint_if_debugging();  // stop if in debugger
}

尚无编译器支持.

总结

C++26 的特性为现代 C++ 编程带来了更多的灵活性和高效性, 通过这些改进, C++ 程序员将能够更轻松地编写出高性能的现代化代码.

相关文章:

C++26 新特性预览(Preview)

文章目录 1. 静态反射 (Static Reflection)示例: 枚举转字符串应用场景 2. 合约 (Contracts)示例: 定义函数合约应用场景 3. 条件中的结构化绑定 (Structured Bindings in Conditions)示例: 改进的错误处理应用场景 4. 包索引 (Pack Indexing)示例: 获取参数包的第一个和最后一…...

MySQL5.7.26-Linux-安装(2024.12)

文章目录 1.下载压缩包1.访问MySQL版本归档2.找到5.7.26并下载3.百度网盘 2.Linux安装1.卸载原来的MySQL8.0.26&#xff08;如果没有则无需在意&#xff09;1.查看所有mysql的包2.批量卸载3.删除残留文件**配置文件**&#xff08;默认路径&#xff09;&#xff1a; 4.**验证卸载…...

2025-1-2-sklearn学习(30)模型选择与评估-验证曲线: 绘制分数以评估模型 真珠帘卷玉楼空,天淡银河垂地。

文章目录 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型30.1. 验证曲线30.2. 学习曲线 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型 文章参考网站&#xff1a; https://sklearn.apachecn.org/ 和 https://scikit-learn.org/stable/ 每种估…...

【优选算法】查找总价格为目标值的两个商品

链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;利用单调性&#xff0c;使用双指针算法解决问题 1.先从小到大排序 2. sum > t : right--; sum < t : left; sum t : return class Solution {public…...

利用 NineData 实现 PostgreSQL 到 Kafka 的高效数据同步

记录一次 PostgreSQL 到 Kafka 的数据迁移实践。前段时间&#xff0c;NineData 的某个客户在一个项目中需要将 PostgreSQL 的数据实时同步到 Kafka。需求明确且普遍&#xff1a; PostgreSQL 中的交易数据&#xff0c;需要实时推送到 Kafka&#xff0c;供下游多个系统消费&#…...

future和CompletableFuture

future 什么是future Future 类是并发编程中一个非常重要的工具。它主要用于表示一个异步计算的结果&#xff0c;允许你在计算完成后获取结果或处理异常。Java 的 Future 也常常与线程池&#xff08;如 ExecutorService&#xff09;结合使用&#xff0c;用来执行并行任务&…...

如何通过深度学习提升大分辨率图像预测准确率?

随着科技的不断进步&#xff0c;图像处理在各个领域的应用日益广泛&#xff0c;特别是在医疗影像、卫星遥感、自动驾驶、安防监控等领域中&#xff0c;大分辨率图像的使用已经成为了一项不可或缺的技术。然而&#xff0c;大分辨率图像带来了巨大的计算和存储压力&#xff0c;同…...

【机器学习】机器学习的基本分类-半监督学习-Ladder Networks

Ladder Networks 是一种半监督学习模型&#xff0c;通过将无监督学习与监督学习相结合&#xff0c;在标记数据较少的情况下实现高效的学习。它最初由 A. Rasmus 等人在 2015 年提出&#xff0c;特别适合深度学习任务&#xff0c;如图像分类或自然语言处理。 核心思想 Ladder N…...

[react]小技巧, ts如何声明点击事件的类型

很简单, 鼠标放到事件上面就行了 如果想知道点击的是什么元素 ,打印他的nodename就行了 不过得断言为html元素才行 const handleClick (e: React.MouseEvent<HTMLDivElement, MouseEvent>) > {console.log(current, (e.target as HTMLElement).nodeName);}; 为什么…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…...

【从零开始】11. LLaMA-Factory 微调 Qwen 模型(番外篇)

书接上回&#xff0c;在完成了 RAGChecker 测试后&#xff0c;离 RAG 应用真正发布还差最后一步 - 基础信息指令微调。考虑到模型还是需要具备一定程度的“自我认知”&#xff0c;因此需要将公司信息“嵌入”到模型里面的。为此&#xff0c;我选择了 LLaMA-Factory&#xff08;…...

WPF使用ContentControl控件实现区域导航,并使用Prism依赖注入优化

背景&#xff1a;使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的&#xff0c;不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel&#xff1a; private object body;public object Body {get { retu…...

JavaWeb——MySQL-DML(1/3)-添加数据insert(DML 操作概述、INSERT 语句插入数据、语句演示、总结)

目录 DML 操作概述 INSERT 语句插入数据 INSERT 语句基础语法 INSERT 语句演示 注意事项 总结 DML 操作概述 DML 简介 DML&#xff08;Data Manipulation Language&#xff09;即数据操作语言&#xff0c;用于对数据库表中的数据进行增删改操作&#xff0c;包括添加数据&…...

经验证:将数据从索尼传输到Android的 4 种方法

概括 像Android Galaxy S20 这样的新型Android智能手机很酷&#xff0c;但除了将数据从索尼传输到Android之外。众所周知&#xff0c;旧的索尼手机上存储着大量的文件&#xff0c;因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题&#xff0c;我们做…...

嵌入式应用实例→电子产品量产工具→UI界面的绘制和测试

前言 之前已经在博文https://blog.csdn.net/wenhao_ir/article/details/144747714中实现了用Freetype在LCD屏上绘制字符&#xff0c;本篇博文我们利用Freetype实现UI界面的绘制。 头文件include\ui.h的分析 头文件内的代码 #ifndef _UI_H #define _UI_H#include <common…...

如何删除 Docker 中的悬虚镜像?

在 Docker 中&#xff0c;悬虚镜像&#xff08;Dangling Images&#xff09;是指那些没有 标签 且没有被任何容器使用的镜像。这些镜像通常是由于构建过程中生成的中间层镜像或未正确清理的镜像残留。删除悬虚镜像可以释放磁盘空间并保持 Docker 环境的整洁。 1. 列出悬虚镜像…...

el-table树形懒加载展开改为点击行展开

思路&#xff1a;获取el-table中小箭头&#xff0c;然后调它的click事件&#xff01; <el-tablerow-click"getOpenDetail":row-class-name"tableRowClassName">// 点击当前行展开节点getOpenDetail(row, column, event) {// 如果是叶子节点或点击的是…...

【Ubuntu】Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS)

Ubuntu server 18.04 搭建Slurm并行计算环境&#xff08;包含NFS&#xff09; 一、Munge 认证模块 1.1、安装 munge 主节点和子节点都安装munge #安装 sudo apt update && sudo apt install munge libmunge-dev#设置开机启动 sudo systemctl enable munge sudo syste…...

高并发场景下的秒杀系统架构设计与实现

引言 秒杀系统是一种高并发场景的典型应用&#xff0c;广泛存在于电商平台、抢票系统和促销活动中。秒杀活动的特点是短时间内吸引大量用户同时访问并尝试抢购商品&#xff0c;这对系统的高并发处理能力、稳定性和用户体验提出了极高的要求。 在秒杀系统中&#xff0c;常见的…...

搭建开源版Ceph分布式存储

系统&#xff1a;Rocky8.6 三台2H4G 三块10G的硬盘的虚拟机 node1 192.168.2.101 node2 192.168.2.102 node3 192.168.2.103 三台虚拟机环境准备 1、配置主机名和IP的映射关系 2、关闭selinux和firewalld防火墙 3、配置时间同步且所有节点chronyd服务开机自启 1、配置主机名和…...

QT----------多媒体

实现思路 多媒体模块功能概述&#xff1a; QT 的多媒体模块提供了丰富的功能&#xff0c;包括音频播放、录制、视频播放和摄像头操作等。 播放音频&#xff1a; 使用 QMediaPlayer 播放完整的音频文件。使用 QSoundEffect 播放简短的音效文件。 录制音频&#xff1a; 使用 QMe…...

选择器(结构伪类选择器,伪元素选择器),PxCook软件,盒子模型

结构为类选择器 伪元素选择器 PxCook 盒子模型 (内外边距&#xff0c;边框&#xff09; 内外边距合并&#xff0c;塌陷问题 元素溢出 圆角 阴影: 模糊半径&#xff1a;越大越模糊&#xff0c;也就是越柔和 案例一&#xff1a;产品卡片 <!DOCTYPE html> <html lang&q…...

Vue2/Vue3 响应式原理对比指南

Vue2/Vue3 响应式原理对比指南 1. 基本实现原理 1.1 Vue2 响应式实现 (Object.defineProperty) // Vue2 响应式核心实现 function defineReactive(obj, key, val) {// 递归处理嵌套对象observe(val);const dep new Dep();Object.defineProperty(obj, key, {get() {// 依赖收…...

FastExcel:超越EasyExcel的新一代Excel处理工具

简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有优点&#xff0c;并且在性能和功能上进行了显著的提升和创新。 FastExcel的特点 高性能读写&#xff1a;FastExcel专注于性能优化&#xff0c;能够高效处理…...

大模型系列17-RAGFlow搭建本地知识库

大模型系列17-RAGFlow搭建本地知识库 安装ollama安装open-wehui安装并运行ragflowRAG&#xff08;检索、增强、生成&#xff09;RAG是什么RAG三过程RAG问答系统构建步骤向量库构建检索模块生成模块 RAG解决LLM的痛点 使用ragflow访问ragflow配置ollama模型添加Embedding模型添加…...

常用的mac软件下载地址

目录 iRightMouse Pro&#xff08;超级右键&#xff09; xmind&#xff08;思维导图&#xff09; Parallels Desktop&#xff08;虚拟机工具&#xff09; Paste&#xff08;跨平台复制粘贴&#xff09; AutoSwitchInput Pro&#xff08;自动切换输入法&#xff09; Snipa…...

基于51单片机和16X16LED点阵屏(74HC138和74HC595驱动)的小游戏《贪吃蛇》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、自制八位独立按键3、点阵屏模块 四、主函数总结 系列文章目录 前言 《贪吃蛇》&#xff0c;一款经典的、怀旧的小游戏&#xff0c;单片机入门必写程序。 以《贪吃蛇》为载体&#xff0c;熟悉各种屏…...

python中常用的内置函数介绍

python中常用的内置函数介绍 1. print()2. len()3. type()4. str(), int(), float()5. list(), tuple(), set(), dict()6. range()7. sum()8. max(), min()9. sorted()10. zip()11. enumerate()12. map()13. filter()14. any(), all()15. abs()16. pow()17. round()18. ord(), …...

【微服务】Spring Cloud Config解决的问题和案例

文章目录 强烈推荐引言解决问题1. 配置管理的集中化2. 配置的版本控制3. 环境特定配置4. 配置的动态刷新5. 安全管理敏感数据6. 配置的一致性 组件1. **配置服务器&#xff08;Config Server&#xff09;**2. **配置客户端&#xff08;Config Client&#xff09;** 配置示例配置…...

华为OD机试E卷 --最小的调整次数--24年OD统一考试(Java JS Python C C++)

文章目录 题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码c++算法源码题目描述 有一个特异性的双端队列一,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。 小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添…...