第五章 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/18 13:56:12 阅读更多 →
artcraft:像素级用户体验的系统化工程方法

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

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

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

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

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

2026/10/18 13:56:12 阅读更多 →

最新新闻

Flink 算子实战:map、filter、flatMap 的选型、组合与性能优化

Flink 算子实战:map、filter、flatMap 的选型、组合与性能优化

1. 为什么这三个算子值得单独拎出来讲刚接触 Flink 的人,十有八九是从map、filter、flatMap这三个算子入门的。它们看起来简单到不需要解释——map就是一进一出,filter就是过滤,flatMap就是一进多出。但我在实际带人做流处理任务的过程中发现…

2026/10/19 16:13:06 阅读更多 →
从暗杀宝录的投掷指令,看 ABAP 如何用有限资源解决关键业务瓶颈

从暗杀宝录的投掷指令,看 ABAP 如何用有限资源解决关键业务瓶颈

/* 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 16:13:06 阅读更多 →
AI辅助开发实战:从代码生成到团队协作的效率革命

AI辅助开发实战:从代码生成到团队协作的效率革命

前几天在团队的需求评审会上,A同学当着所有人的面,把一段模糊得不能再模糊的需求描述丢给了AI代码助手,不到一分钟,接口对接的样板代码就出来了。大家愣了两秒钟,然后该吵参数还是吵参数,但那一刻我心里很清…

2026/10/19 16:13:06 阅读更多 →
给音乐库批量补上 LRC 歌词:163MusicLyrics 音乐歌词下载工具实操指南

给音乐库批量补上 LRC 歌词:163MusicLyrics 音乐歌词下载工具实操指南

给音乐库批量补上 LRC 歌词:163MusicLyrics 音乐歌词下载工具实操指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 音乐库里几百首歌,歌词文件…

2026/10/19 16:13:06 阅读更多 →
HCP-MMP1.0图谱掩码提取:基于MATLAB的fMRI ROI分析工具

HCP-MMP1.0图谱掩码提取:基于MATLAB的fMRI ROI分析工具

简介:这套由MATLAB编写的开源提取工具,面向脑影像与神经科学研究人员,用于从人类连接组项目HCP-MMP1.0分区图谱中快速提取指定脑区的体积二进制掩码。HCP-MMP1.0图谱包含精细的皮层脑区划分,但直接操作图谱文件需处理复杂的体素索…

2026/10/19 16:13:06 阅读更多 →
RAG全链路拆解:从文档解析到检索优化的实战指南

RAG全链路拆解:从文档解析到检索优化的实战指南

RAG这两年几乎是所有大模型应用绕不开的话题,尤其是在企业内部知识库问答、私有文档检索、客服助手这类场景里,它已经是标配方案了。但我在和一些开发者、产品经理聊的时候发现,大家对RAG的理解往往停在“检索生成”这四个字上,知…

2026/10/19 16:12:02 阅读更多 →

日新闻

频率跟踪型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/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

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

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →