Modern C++ 特性小结

Modern C++ 学习笔记——C++面向对象编程 结合三种设计模式,让你更加理解C++面向对象的特性,建议收藏~~~!!! ModernC++学习笔记是一系列介绍现代C++新特性的文章,结合《effective modern C++》说明了如何更好的使用这些新特性。相互讨论,共同学习,不断成长 阅读详情

系列文章目录



前言

The Zen of Python, by Tim Peters


Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren’t special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you’re Dutch.

Now is better than never.

Although never is often better than right now.

If the implementation is hard to explain, it’s a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea – let’s do more of those!


C++11

C++11是C++自C++98以来的第二个重要更新。大量更新被引入标准,提升了C++的抽象程度。

1. 诊断库

<exception>
<system_error>

异常处理头文件和系统错误头文件

捕获和存储异常对象

uncaught_exceptions

std::terminate();  // 默认调用std::abort

typedef void ( *terminate_handler )();
// 返回set之前的值
std::terminate_handler set_terminate( std::terminate_handler f ) noexcept;
std::terminate_handler get_terminate() noexcept;

2. 元编程库

C++提供元编程工具,如 type traits, compile-time rational arithmetic, and compile-time integer sequences.

type traits定义了编译时基于模板的类型属性查询接口。

一元type traits用于检查类型是 std::true_type / std::false_type

<type_traits>
is_void checks if a type is void

is_null_pointer checks if a type is std::nullptr_t

is_integral checks if a type is an integral type

is_floating_point checks if a type is a floating-point type

is_array checks if a type is an array type

is_enum checks if a type is an enumeration type

is_union checks if a type is a union type

is_class checks if a type is a non-union class type

is_function checks if a type is a function type

is_pointer checks if a type is a pointer type

is_lvalue_reference checks if a type is an lvalue reference

is_rvalue_reference checks if a type is an rvalue reference

is_member_object_pointer checks if a type is a non-static member object pointer

is_member_function_pointer checks if a type is a non-static member function pointer

3. 通用工具库

4. 容器库

5.

C++17

std::optional

std::optional<int> optInt;          // 默认不包含值
std::optional<std::string> optStr = "Hello"; // 直接初始化
std::optional<double> optDouble = std::nullopt; // 显式表示无值
Column 1Column 2
has_value()检查是否包含值 (bool 类型)
value()获取值,若无值则抛出 std::bad_optional_access
value_or(T default)返回值或默认值
operator*解引用获取值(需确保有值)
operator->访问成员(如 opt->size())
reset()清除值,变为 std::nullopt

使用场景

  1. 函数可能无返回值
  2. 避免特殊标记
  3. std::optional 提供了一种类型安全的方式处理“可能有值”的逻辑,避免了传
    统方法的潜在错误。

C++23

- std::expected<T, E>

核心概念

https://github.com/martinmoene/expected-lite

std::expected<T, E> 是一个模板类,包含两个可能的成员:

​​期望值​​(Value):类型为 T 的有效结果。
​​错误值​​(Error):类型为 E 的错误信息。
通过明确的类型区分,它强制开发者显式处理可能的错误,避免忽略错误检查的风险。

主要特性​

  1. ​​类型安全的错误处理​​
    替代传统的错误码(如返回 int 错误码)或异常(try/catch),提供编译时的类型检查。
    错误类型 E 可以是自定义类型(如枚举、结构体),增强错误信息的表达能力。
Column 1Column 2
has_value()检查是否包含有效值(返回 bool)。
operator->访问有效值的成员(仅在包含有效值时可用)。
operator*解引用有效值(仅在包含有效值时可用)。
value()返回有效值,若无值则抛出 std::bad_expected_access。
error()返回错误值,若存在有效值则抛出 std::bad_expected_access。

使用场景

​​1. 替代错误码​​
避免函数返回歧义的错误码(如 -1 或 nullptr),明确区分成功和失败的结果。
​2. ​替代异常​​
在禁用异常的环境(如嵌入式系统)中,提供类型安全的错误传递机制。
3. ​​链式操作​​
通过 transform 和 and_then 实现函数式编程风格的链式调用,简化错误处理逻辑。

- std::scope_exit

template<typename EF>
class scope_exit
{
  public:
    explicit scope_exit(EF&& fn): exit_function_(std::forward<EF>(fn) {}
   	...
    ~scope_exit()
    {
        if (!flag_) exit_function_();
        flag_ = true;
    }
    void cancelle() { flag_= true; }
  private:
    EF exit_function_;
    bool flag_{false};
};

总结

无

C++11(及现代C++风格) 过去的一年我在微软亚洲研究院做输入法,我们的产品叫“英库拼音输入法” (下载Beta版),如果你用过“英库词典” (现已更名为必应词典),应该知道“英库”这个名字(实际上我们的核心开发团队也有很大一部分来源于英库团队的老成员)。整个项目是微软亚洲研究院的自然 语言处理组、互联网搜索与挖掘组和我们创新工程中心,以及微软中国Office商务软件部(MODC)多组合作的结果。至于我们的输入法有哪些创新的 阅读详情

相关推荐

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

本文详细介绍了如何使用SpannableStringBuilder在Android平台上构建专业级AI对话界面,涵盖流式文本处理、富文本解析、交互优化等核心技术。通过实战代码示例,帮助开发者实现类似DeepSeek的AI产品交互效果,提升用户体验和应用专业度。

weixin_28358083的博客 198

CCG-Workflow C/C++ 领域技能:从智能指针、RAII 到 CMake 的 Modern C++ 实战指南

ccg-workflow 仓库内置了一套"领域技能"(domain skill)体系,其中 [C/C++ 技能文件](https://link.gitcode.com/i/7871aacbdd16d54a4051efa904ee901b) 是开发语言域下的一份高密度知识库:它覆盖了 C++17/20 的智能指针、容器与算法、Lambda、并发编程,以及 RAII 内存管理、ASan/Valgrin

gitblog_01073的博客 1062

STM32实战:用定时器触发ADC+DMA双缓冲实现电机电流采样(附避坑指南)

本文详细介绍了如何利用STM32的定时器触发ADC注入组采样,结合DMA双缓冲机制实现电机电流的高效采样。通过PWM触发和双缓冲架构,解决了开关噪声干扰、实时性要求和数据一致性等核心挑战,显著降低CPU负载并提升采样精度。附有完整的代码示例和避坑指南,适用于无人机电调、工业伺服驱动器等高精度电机控制场景。

weixin_33737134的博客 520

ECC 的 C++ 编码标准技能:基于 C++ Core Guidelines 的 Modern C++ 规范、反模式清单与自动化审查实践

ECC 仓库内置了一个名为 `cpp-coding-standards` 的技能文档([SKILL.md](https://link.gitcode.com/i/1715e79726769768eb2f6e300632ce14)),它把 C++ Core Guidelines 浓缩为一份覆盖哲学/接口、函数、类、资源管理、异常、并发、模板、标准库、枚举、命名与性能等 13 个维度的可执行编码标准,

gitblog_00342的博客 1095

Mplus实战:如何用潜在类别分析(LCA)快速搞定心理学数据分类?

本文详细介绍了如何运用Mplus软件进行潜在类别分析(LCA),以快速处理心理学数据并识别内部异质性群体。文章从数据准备、Mplus语法编写、模型拟合与选择,到结果解读与高级应用(如纳入协变量),提供了完整的实战指南,帮助研究者从变量视角转向个体视角,有效挖掘数据中的潜在子类别。

weixin_28318011的博客 410

Impala>Impala安装部署

文章目录1.安装前提2.下载安装包、依赖包3.虚拟机新增磁盘(可选)4.配置本地yum源5.安装Impala6.修改Hadoop、Hive配置7.修改impala配置8.启动、关闭impala服务 1.安装前提 集群提前安装好hadoop,hive。 hive安装包scp在所有需要安装impala的节点上,因为impala需要引用hive的依赖包。 hadoop框架需要支持C程序访问接口,查看下...

qq_44509920的博客 838

JSON_HAS_CPP_11/14/17/20/23/26 宏详解:nlohmann/json 如何检测并强制指定 C++ 语言标准

nlohmann/json(JSON for Modern C++)以 C++11 为最低基线,但对 C++17、C++20、C++23 乃至 C++26 的新特性提供了渐进式支持。本文聚焦该库的 `JSON_HAS_CPP_11`、`JSON_HAS_CPP_14`、`JSON_HAS_CPP_17`、`JSON_HAS_CPP_20`、`JSON_HAS_CPP_23`、`JSON_HAS_C

gitblog_00009的博客 330

别再只调A*算法了!聊聊ROS机器人导航中,OpenCV视觉信息如何与激光雷达数据“打配合”

本文探讨了ROS机器人导航中激光雷达与OpenCV视觉融合的实战策略,揭示了如何通过多模态感知提升导航精度。文章详细介绍了视觉特征到代价地图的转化方法、系统级挑战的工程解决方案,以及融合感知下的路径规划进化,帮助开发者优化机器人导航系统。

weixin_29278805的博客 226

JSON for Modern C++ 之 basic_json:类模板、类型系统与完整 API 索引解析

> 本文是围绕仓库 [docs/mkdocs/docs/api/basic_json/index.md](https://link.gitcode.com/i/89cae38940407e3b17f71e15c209c1ef) 这一核心参考页展开的技术解读。作为 `nlohmann/json` 的心脏,`basic_json` 是一个用 11 个模板参数把 JSON 的每种数据类型都映射到 C++

gitblog_00086的博客 349

博途PLC信号处理系列之卡尔曼滤波程序(Kalman Filter)

三菱系列PLC的卡尔曼滤波程序,可以参看下面这篇博文PLC滤波算法之卡尔曼滤波(kalmanFilter)代码+测试_RXXW_Dor的博客-优快云博客_plc滤波kalman滤波是采用递归的方法解决线性滤波问题,只需要当前的测量值input(西门子PLC里比如我们的模拟量通道AIW0值)和前一个采样周期的估计值(上一个时刻的滤波输出结果last_out)就能进行状态估计,需要的存储空间小,每一步的计算量小。下面我们通过程序代码一一给大家展示下。注意。......

RXXW_Dor的博客 3475

SAP SLT DMIS 2018_1_752 究竟是什么意思?

把读懂,并不需要背太多编号。你只要记住:它就是DMIS 2018发行线里、面向的那一档组件版本,承载SLT 3.0的功能集。面向项目落地,要点就是三件事:看清平台基线、对齐DMIS支持包、走官方安装与补丁路径。如此,S/4到HANA,抑或S/4到BigQuery的复制链路,都会变得既稳定又可维护。DMIS 2018是新技术发行,基于,覆盖SLT全场景(SAP Learning)。DMIS_2018的安装与下载路径、通过SAINT安装的官方步骤(Installation Guide PDF)。源系统与。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

JSON for Modern C++ 中 basic_json::count 接口详解:键计数查询、透明比较约束与源码实现

本文围绕 [nlohmann::basic_json::count](https://link.gitcode.com/i/cb1d57870f1984b97d77228031d8b836) 这一 API 参考文档展开,系统讲解 JSON for Modern C++(nlohmann/json)中 `count()` 方法两个重载的声明、参数、返回值与版本历史,并结合仓库源码([include/

gitblog_00253的博客 321

IgH EtherCAT 从入门到精通:第 5 章 多主站与系统集成配置

本文介绍了 EtherCAT 多主站配置与系统集成方法。主要内容包括: 多主站实例配置原理:通过内核模块参数指定多个主站设备,每个主站独立管理一条 EtherCAT 总线,最多支持32个主站实例。 配置文件详解:在/etc/ethercat.conf中通过MASTER<X>_DEVICE变量定义各主站绑定的网卡或MAC地址,支持冗余备份配置。 系统服务集成:提供了systemd服务单元文件和传统init.d脚本两种方式实现开机自启动和管理,并建议通过override文件定制服务依赖关系。 架构示

从事嵌入式linux android驱动开发,拥有全栈能力 352

JSON for Modern C++:全面掌握在内存中创建 JSON 值的五种核心方式

本文基于 nlohmann/json(JSON for Modern C++)官方文档 [creating_values.md](https://link.gitcode.com/i/7ea5f02c414f4bb12e22afe9ac784dd4) 编写,系统讲解在内存中构建 `json` 对象的完整方法:从原生 C++ 值直接转换、用花括号初始化列表简洁书写、通过 `operator[]` 增

gitblog_01103的博客 881

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JSON for Modern C++ 宏(Macros)完全配置指南:从运行时断言到类型序列化宏速查

nlohmann/json(即 “JSON for Modern C++”)的很多行为并非只能靠 API 调用控制,而是可以在**包含 `json.hpp` 头文件之前**通过定义预处理器宏来整体定制。本文以官方 API 文档中的 [Macros 索引页](https://link.gitcode.com/i/71bcab1783a53dc079e7c871b66ca971)为骨架,系统梳理这些宏

gitblog_00003的博客 645

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CppCon 2016 学习:BUILDING A MODERN C++ FORGE FOR COMPUTE AND GRAPHICS

从底层开始思考”,尝试定义一个核心调用接口的函数签名。Regular types by default(默认规则类型)规则类型 (Regular Type)是 C++ 中设计良好的类型,满足:默认构造、拷贝构造、赋值、析构(四法则)都存在且语义合理。支持相等比较(==,!=)。这让类型行为可预测且易于组合使用,符合现代 C++ 编程惯例。单例管理 Vulkan 实例,保证唯一性和延迟初始化。环境区分,方便调试与发布之间切换。封装与自动管理生命周期,让上层用户不用担心销毁和资源释放。

虾球 743

JSON for Modern C++ basic_json::end():越尾迭代器(past-the-end iterator)的语义、源码剖析与实战用法

在 JSON for Modern C++(nlohmann/json)中,`end()` 是与 `begin()` 配对的成员函数,用于返回"指向最后一个元素之后一个位置"的迭代器,是 C++ 区间语义 `[begin, end)` 的右端点。理解它的行为——尤其是它对 object、array、null 以及各基本类型分别如何构造越尾迭代器,以及为什么它承诺零异常与常数复杂度——是正确编写 r

gitblog_01119的博客 612

拆解rsgain的C++架构:ReplayGain工具的ScanJob扫描流水线、TagLib标签写入与多线程调度原理

rsgain(**r**eally **s**imple **gain**)是一个基于 C++ 编写的 ReplayGain 2.0 命令行标签工具:它逐轨解码音频、按 EBU R128 标准计算响度,再将 ReplayGain 增益标签写回 MP3、FLAC、Opus 等十余种格式,全程不改动音频流。本文从源码层面拆解它的三大核心设计:**ScanJob 扫描流水线**、**基于 TagLib

gitblog_00430的博客 357

深入解析 nlohmann::basic_json::find():JSON for Modern C++ 中安全高效的键查找接口

在 JSON for Modern C++(nlohmann/json)中,`find()` 是 `basic_json` 类用于在 JSON 对象中按键定位元素的查找接口。它返回迭代器而非值本身,且对非对象类型保证不抛异常,是替代"先判断类型再取元素"写法的更优选择。读完后,你将掌握 `find()` 两个重载的签名与语义、C++17 透明比较器(transparent comparator)带

gitblog_00731的博客 265

LinkSwift:免费网盘直链下载助手,一键拿到真实下载地址

进度条卡在 15KB/s 半天不动,官方客户端的下载队列里还排着七个文件——这种时候你需要的不是更耐心,而是能把真实下载地址直接摆到页面上的工具。LinkSwift 就是一个免费网盘直链下载助手,基于 JavaScript 的油猴脚本,覆盖百度网盘、阿里云盘、夸克网盘等八大网盘,装好到解析出第一条直链约三分钟。 ## 装前装后:一张表看明白 | 不用它 | 用它之后 | | --- | ---

gitblog_00975的博客 798

第一章 C++语言概述

计算机这东西,本质上是个只会算数的傻子。你让它显示一个字,它内部要转过好几道弯。它听得懂的只有 0 和 1,别的都不会说。程序,就是我们写给它的指令清单。问题在于没人想用 01 写清单,看一行都费劲,改一晚上能要命。于是有了程序设计语言,充当人和机器之间的中间人。我们用接近人的写法描述意图,再让翻译程序把它变成 01。│ 程序设计语言的三级阶梯 ││ 语言一代一代改,方向只有一个,离人越来越近 ││ ││ │ 第一代 机器语言 01001000 00100001,全是 0 和 1 │ │。

weixin_45361679的博客 440

JSON for Modern C++ 中 json_pointer::operator!= 的不等比较机制、异常行为与源码解析

本文围绕 JSON for Modern C++(nlohmann/json)的 API 文档 `nlohmann::json_pointer::operator!=` 展开,完整覆盖其三个重载的签名、模板参数、返回值、异常安全保证与复杂度特征,并结合仓库中 [json_pointer.hpp](https://link.gitcode.com/i/7c2fa059de0304eeada2ae14

gitblog_00580的博客 432

JSON for Modern C++ 的 basic_json::array_t 详解:JSON 数组的底层容器类型与定制方法

> 本文聚焦 nlohmann/json(JSON for Modern C++)中负责存储 JSON 数组的类型 `basic_json::array_t`,讲解它的类型别名定义、模板参数与默认展开、在类内部的指针式存储结构、嵌套深度限制,以及如何通过自定义容器与分配器扩展数组容器。读完本文,你将能准确理解 `array_t` 与 `std::vector<nlohmann::json>` 的关

gitblog_00191的博客 799

现代 C++ 教程(C++11 至 C++26)开源项目全景指南:阅读路径、随书源码与本地构建实战

本篇技术指南围绕《现代 C++ 教程:高速上手 C++11 到 C++26》开源仓库展开,系统梳理该项目的定位、全书章节地图、四种阅读方式、随书源码与习题的组织结构,并结合仓库内的 Makefile、Dockerfile 与构建脚本,完整还原从源码到 PDF/EPUB/网站成品的本地构建流程。读完本文,你将能快速判断这份教程是否适合自己,并掌握按章节查阅代码、运行随书示例以及在自己的机器上完整构建

gitblog_00237的博客 72

JSON for Modern C++ 深度解析:basic_json::operator<=> 三路比较运算符(C++20 spaceship 运算符)

在 C++20 环境下使用 nlohmann::json(JSON for Modern C++)时,`operator<=>`(俗称 spaceship 运算符)让两个 JSON 值可以直接进行三路比较,返回 `std::partial_ordering`(less / equivalent / greater / unordered 四态结果),天然适配 `std::map`、`std::so

gitblog_00860的博客 466

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 246
上一篇: 关于软件开发的一些思考
下一篇: UML简介
耶耶耶耶耶~
博客等级 码龄9年 943粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值