第五章 C++20标准的改进(代码说明)
// cpp20_demo.cpp// 编译: g -stdc20 -pthread cpp20_demo.cpp -o cpp20_demo// 运行: ./cpp20_demo#include iostream // 输入输出#include format // C20 格式化库#include concepts // C20 概念#include ranges // C20 范围库#include span // C20 span#include vector // 动态数组#include string // 字符串#include array // 固定数组#include algorithm // 算法#include compare // 三路比较#include coroutine // 协程支持#include optional // 可选值#include numbers // 数学常量// // 全局辅助// templatetypename T // 定义概念concept Addable requires(T a, T b) { // 要求 a b 合法{ a b } - std::same_asT; // 且返回类型是 T};templateAddable T // 用概念约束T add(const T a, const T b) { // 通用加法return a b; // 返回结果}struct Point { // 三路比较int x, y; // 坐标auto operator(const Point) const default; // 自动生成所有比较};struct WindowConfig { // 指定初始化器int width 800; // 默认宽int height 600; // 默认高std::string title Untitled; // 默认标题};consteval int compile_time_square(int x) { // 必须编译期求值return x * x; // 返回平方}constinit int global_init compile_time_square(5); // 编译期初始化templatetypename T // 生成器模板struct Generator { // 协程生成器struct promise_type { // 协程承诺类型T current_value; // 当前值auto get_return_object() { // 创建返回对象return Generator{ std::coroutine_handlepromise_type::from_promise(*this) };}auto initial_suspend() { return std::suspend_never{}; } // 立即开始auto final_suspend() noexcept { return std::suspend_always{}; } // 结束保持挂起void return_void() {} // 无返回值void unhandled_exception() { std::terminate(); } // 异常终止auto yield_value(T value) { // co_yield 处理current_value value; // 保存值return std::suspend_always{}; // 暂停等待恢复}};std::coroutine_handlepromise_type handle; // 协程句柄explicit Generator(std::coroutine_handlepromise_type h) : handle(h) {} // 构造Generator(const Generator) delete; // 禁止拷贝Generator operator(const Generator) delete; // 禁止拷贝赋值Generator(Generator o) noexcept : handle(o.handle) { o.handle nullptr; } // 移动构造Generator operator(Generator o) noexcept { // 移动赋值if (this ! o) { // 防止自赋值if (handle) handle.destroy(); // 销毁旧句柄handle o.handle; // 接管新句柄o.handle nullptr; // 置空源对象}return *this; // 返回自身}~Generator() { if (handle) handle.destroy(); } // 析构销毁bool next() { // 恢复协程if (!handle || handle.done()) return false; // 已结束handle.resume(); // 恢复执行return !handle.done(); // 是否还有值}T value() const { return handle.promise().current_value; } // 获取当前值};Generatorint count_up_to(int max) { // 生成 1..maxfor (int i 1; i max; i) // 循环co_yield i; // 产出并暂停}void print_span(std::spanconst int data, std::string_view label) { // span 打印std::cout label : ; // 提示for (int x : data) std::cout x ; // 遍历std::cout \n; // 换行}// // main// int main() { // 程序入口std::cout 1. 概念:\n; // 提示std::cout add(3,4) add(3, 4) \n; // intstd::cout add(1.5,2.5) add(1.5, 2.5) \n; // doublestatic_assert(Addableint); // 编译期检查std::cout 2. 三路比较:\n; // 提示Point p1{1, 2}, p2{3, 4}; // 两个点std::cout p1 p2: (p1 p2) \n; // 自动生成std::cout 3. 指定初始化器:\n; // 提示WindowConfig cfg2{ .width 1024, .height 768 }; // 指定部分成员std::cout cfg2.width x cfg2.height cfg2.title \n; // 输出std::cout 4. consteval / constinit:\n; // 提示constexpr int sq compile_time_square(6); // 编译期std::cout sq sq , global_init global_init \n; // 输出std::cout 5. std::format:\n; // 提示std::cout std::format({} 的年龄是 {}\n, Alice, 30); // 基本std::cout std::format({:.2f}\n, 95.5); // 精度std::cout std::format(|{:10}|{:10}|{:^10}|\n, left, right, center); // 对齐std::cout 6. std::span:\n; // 提示int carr[] {1, 2, 3, 4, 5}; // C 数组std::vectorint vec {10, 20, 30}; // vectorstd::arrayint, 4 arr {100, 200, 300, 400}; // arrayprint_span(carr, C array); // 打印print_span(vec, vector); // 打印print_span(arr, array); // 打印std::cout 7. Ranges / Views:\n; // 提示std::vectorint nums {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 数据源std::cout views: ; // 提示auto result nums // 从 nums 开始| std::views::filter([](int x) { return x % 2 0; }) // 筛选偶数| std::views::transform([](int x) { return x * x; }) // 平方| std::views::take(3); // 取前 3for (int x : result) std::cout x ; // 输出std::cout \n; // 换行std::cout reverse: ; // 提示for (int x : nums | std::views::reverse | std::views::take(3)) // 反转取前 3std::cout x ; // 输出std::cout \n; // 换行std::cout 8. 协程:\n; // 提示auto gen count_up_to(5); // 创建生成器std::cout coroutine: ; // 提示while (gen.next()) { // 逐个恢复std::cout gen.value() ; // 输出当前值}std::cout \n; // 换行std::cout 9. 数学常量:\n; // 提示std::cout std::format(pi {:.10f}\n, std::numbers::pi); // πstd::cout std::format(e {:.10f}\n, std::numbers::e); // estd::cout \n全部 C20 示例运行完毕。\n; // 结束提示return 0; // 正常返回}

相关新闻

MATLAB语音加噪去噪课设全流程:FIR与IIR滤波器设计对比与评估

MATLAB语音加噪去噪课设全流程:FIR与IIR滤波器设计对比与评估

简介:基于MATLAB的含噪语音信号处理,是数字信号处理课程设计中兼顾理论与工程实现的典型课题。该方案针对带有噪声的语音信号进行时域与频域分析,使用窗函数法完成FIR数字滤波器设计,并采用巴特沃斯、切比雪夫及双线性变换法设计I…

2026/10/19 16:13:16 阅读更多 →
artcraft:像素级用户体验的系统化工程方法

artcraft:像素级用户体验的系统化工程方法

1. 项目概述:从“artcraft”这个词开始,我们到底在做什么?“artcraft”这个词乍看像一个合成词,拆开是 art(艺术)和 craft(工艺),合起来直译就是“艺术工艺”。但放在当下…

2026/10/18 13:56:12 阅读更多 →
用Trae开发大模型智能应用:一位工程师的实战复盘

用Trae开发大模型智能应用:一位工程师的实战复盘

最近后台有朋友问我最多的一句话是:“你说你用Trae写大模型应用,到底是个什么体验?”说实话,半年前我也对AI编程助手半信半疑,总觉得代码还得自己一行行敲才靠谱。直到我把一个智能问答Demo从需求到上线完整跑了一遍&a…

2026/10/19 16:13:19 阅读更多 →

最新新闻

分布式电源接入对配电网故障定位的影响:Python仿真与分析

分布式电源接入对配电网故障定位的影响:Python仿真与分析

1. 为什么分布式电源一进来,故障定位就开始"犯迷糊" 先说点我自己的体会。搞配电网的人都知道,传统配电网的设计思路是"单电源、辐射状",电能从变电站流向用户,路径清晰,方向和大小都很好预测。所…

2026/10/19 19:59:32 阅读更多 →
MySQL ERROR 1055深度解析:ONLY_FULL_GROUP_BY报错原因与五种解决方案

MySQL ERROR 1055深度解析:ONLY_FULL_GROUP_BY报错原因与五种解决方案

干后端这几年,MySQL 报错里跟开发者打交道最频繁的,我觉得 1055 得排前三。尤其是项目从 5.6 升到 5.7 之后,原来跑得好好的统计查询突然一夜之间全炸了,控制台刷出一串 ERROR 1055 (42000) ,后面还挂着一长串 Expr…

2026/10/19 19:59:32 阅读更多 →
个人能力盘点指南:用三层模型和杠杆点系统提升skills

个人能力盘点指南:用三层模型和杠杆点系统提升skills

1. 从“skills”这个词说起:它到底指什么“skills”这个词看起来简单,但放在不同语境里,含义差别很大。有人看到它想到的是简历上那一栏“专业技能”,有人想到的是游戏里的技能树,还有人想到的是团队协作中每个人各自擅…

2026/10/19 19:59:32 阅读更多 →
具身世界动作模型全解析:从机器人控制到端到端预测

具身世界动作模型全解析:从机器人控制到端到端预测

1. 先聊聊为什么"感知—规划—控制"的老路子走到了尽头做机器人控制项目做到第六个月,我最大的体会是:卡住你的往往不是控制器,而是模型对世界到底有没有"预判"。过去几年,工业里最成熟的机器人方案几乎都走同…

2026/10/19 19:58:29 阅读更多 →
BurpSuite弱口令爆破神器:xia_Liao插件设计与实战解析

BurpSuite弱口令爆破神器:xia_Liao插件设计与实战解析

做Web安全评估时,最枯燥也最绕不开的一步就是弱口令检测。BurpSuite几乎是每个Web测试者都会装的工具,但原生Intruder在真实登录场景下用起来总有各种不顺:并发调快了容易被风控拦,调慢了又等到手酸;结果筛出来一堆200…

2026/10/19 19:58:29 阅读更多 →
AirLLM:低显存显卡也能跑70B大模型?分层推理实战解读

AirLLM:低显存显卡也能跑70B大模型?分层推理实战解读

一块6GB显存的普通显卡,跑一个70B参数级别的开源大模型——这话说出来多半会被当段子。可AirLLM这个项目偏偏就是干这件事的:它不需要你改一行模型代码,不需要把权重压缩到面目全非,也不要求你去租贵到肉疼的高端云GPU实例&#x…

2026/10/19 19:58:29 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →