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 引入了在 if 或 while 条件语句中使用结构化绑定的能力, 进一步简化了错误处理流程.
示例: 改进的错误处理
#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(如果没有则无需在意)1.查看所有mysql的包2.批量卸载3.删除残留文件**配置文件**(默认路径): 4.**验证卸载…...
2025-1-2-sklearn学习(30)模型选择与评估-验证曲线: 绘制分数以评估模型 真珠帘卷玉楼空,天淡银河垂地。
文章目录 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型30.1. 验证曲线30.2. 学习曲线 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型 文章参考网站: https://sklearn.apachecn.org/ 和 https://scikit-learn.org/stable/ 每种估…...
【优选算法】查找总价格为目标值的两个商品
链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode) 解法:利用单调性,使用双指针算法解决问题 1.先从小到大排序 2. sum > t : right--; sum < t : left; sum t : return class Solution {public…...
利用 NineData 实现 PostgreSQL 到 Kafka 的高效数据同步
记录一次 PostgreSQL 到 Kafka 的数据迁移实践。前段时间,NineData 的某个客户在一个项目中需要将 PostgreSQL 的数据实时同步到 Kafka。需求明确且普遍: PostgreSQL 中的交易数据,需要实时推送到 Kafka,供下游多个系统消费&#…...
future和CompletableFuture
future 什么是future Future 类是并发编程中一个非常重要的工具。它主要用于表示一个异步计算的结果,允许你在计算完成后获取结果或处理异常。Java 的 Future 也常常与线程池(如 ExecutorService)结合使用,用来执行并行任务&…...
如何通过深度学习提升大分辨率图像预测准确率?
随着科技的不断进步,图像处理在各个领域的应用日益广泛,特别是在医疗影像、卫星遥感、自动驾驶、安防监控等领域中,大分辨率图像的使用已经成为了一项不可或缺的技术。然而,大分辨率图像带来了巨大的计算和存储压力,同…...
【机器学习】机器学习的基本分类-半监督学习-Ladder Networks
Ladder Networks 是一种半监督学习模型,通过将无监督学习与监督学习相结合,在标记数据较少的情况下实现高效的学习。它最初由 A. Rasmus 等人在 2015 年提出,特别适合深度学习任务,如图像分类或自然语言处理。 核心思想 Ladder N…...
[react]小技巧, ts如何声明点击事件的类型
很简单, 鼠标放到事件上面就行了 如果想知道点击的是什么元素 ,打印他的nodename就行了 不过得断言为html元素才行 const handleClick (e: React.MouseEvent<HTMLDivElement, MouseEvent>) > {console.log(current, (e.target as HTMLElement).nodeName);}; 为什么…...
智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2
本文要点 对程序设计而言:前者基于一个自上而下的 分类体系--(生物遗传基因),后者者需要一个收集差异的自下而上的差异继承路径--(系统继承源流) 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…...
【从零开始】11. LLaMA-Factory 微调 Qwen 模型(番外篇)
书接上回,在完成了 RAGChecker 测试后,离 RAG 应用真正发布还差最后一步 - 基础信息指令微调。考虑到模型还是需要具备一定程度的“自我认知”,因此需要将公司信息“嵌入”到模型里面的。为此,我选择了 LLaMA-Factory(…...
WPF使用ContentControl控件实现区域导航,并使用Prism依赖注入优化
背景:使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的,不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel: private object body;public object Body {get { retu…...
JavaWeb——MySQL-DML(1/3)-添加数据insert(DML 操作概述、INSERT 语句插入数据、语句演示、总结)
目录 DML 操作概述 INSERT 语句插入数据 INSERT 语句基础语法 INSERT 语句演示 注意事项 总结 DML 操作概述 DML 简介 DML(Data Manipulation Language)即数据操作语言,用于对数据库表中的数据进行增删改操作,包括添加数据&…...
经验证:将数据从索尼传输到Android的 4 种方法
概括 像Android Galaxy S20 这样的新型Android智能手机很酷,但除了将数据从索尼传输到Android之外。众所周知,旧的索尼手机上存储着大量的文件,因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题,我们做…...
嵌入式应用实例→电子产品量产工具→UI界面的绘制和测试
前言 之前已经在博文https://blog.csdn.net/wenhao_ir/article/details/144747714中实现了用Freetype在LCD屏上绘制字符,本篇博文我们利用Freetype实现UI界面的绘制。 头文件include\ui.h的分析 头文件内的代码 #ifndef _UI_H #define _UI_H#include <common…...
如何删除 Docker 中的悬虚镜像?
在 Docker 中,悬虚镜像(Dangling Images)是指那些没有 标签 且没有被任何容器使用的镜像。这些镜像通常是由于构建过程中生成的中间层镜像或未正确清理的镜像残留。删除悬虚镜像可以释放磁盘空间并保持 Docker 环境的整洁。 1. 列出悬虚镜像…...
el-table树形懒加载展开改为点击行展开
思路:获取el-table中小箭头,然后调它的click事件! <el-tablerow-click"getOpenDetail":row-class-name"tableRowClassName">// 点击当前行展开节点getOpenDetail(row, column, event) {// 如果是叶子节点或点击的是…...
【Ubuntu】Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS)
Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS) 一、Munge 认证模块 1.1、安装 munge 主节点和子节点都安装munge #安装 sudo apt update && sudo apt install munge libmunge-dev#设置开机启动 sudo systemctl enable munge sudo syste…...
高并发场景下的秒杀系统架构设计与实现
引言 秒杀系统是一种高并发场景的典型应用,广泛存在于电商平台、抢票系统和促销活动中。秒杀活动的特点是短时间内吸引大量用户同时访问并尝试抢购商品,这对系统的高并发处理能力、稳定性和用户体验提出了极高的要求。 在秒杀系统中,常见的…...
搭建开源版Ceph分布式存储
系统: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、配置主机名和…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
