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

【unique_str 源码学习】

文章目录

    • 1.删除器定义
    • 2. operator->() 运算符重载
    • 3. add_lvalue_reference<element_type>::type 使用

基本原理这篇博主写的很详细

https://yngzmiao.blog.csdn.net/article/details/105725663

1.删除器定义

deleter_type& get_deleter() noexcept                  // 获取删除器
{ return std::get<1>(_M_t); }

在这里插入图片描述
在这里插入图片描述

2. operator->() 运算符重载

pointer operator->() const noexcept                   // 智能指针->运算符
{_GLIBCXX_DEBUG_ASSERT(get() != pointer());          // 断言 get() 不等于 pointer()return get();                                        // 返回 get() 的值
}

这个函数的作用是:

  1. 断言:在 operator->() 函数内部,首先调用 _GLIBCXX_DEBUG_ASSERT 函数来断言 get() != pointer()。这意味着 std::unique_ptr 的 get() 方法返回的指针不能等于 std::unique_ptr 自身的指针。这是为了确保 std::unique_ptr 的 get() 方法返回的指针是有效的,指向的是 std::unique_ptr 管理的对象。

  2. 返回指针:如果断言成功,operator->() 函数会返回 get() 方法返回的指针。get() 方法返回的是 std::unique_ptr 管理的对象的指针。

operator->() 函数的作用是允许用户通过 std::unique_ptr 对象访问其管理的对象的成员。例如,如果 std::unique_ptr 管理的是一个 MyClass 对象,你可以通过 ptr->member 的方式访问 MyClass 对象的成员,而不是通过ptr.get()->member 的方式。(内部实现是通过ptr.get()->member

请注意,operator->() 函数被声明为 noexcept,这意味着这个函数不会抛出异常。这对于智能指针的实现非常重要,因为智能指针需要在析构函数或 reset 方法中调用删除器,而不能抛出异常。

#include <iostream>
#include <memory>class MyClass {
public:int value;void print() const {std::cout << "Value: " << value << std::endl;}
};int main() {// 创建一个 MyClass 对象,并使用 std::unique_ptr 管理它std::unique_ptr<MyClass> ptr(new MyClass);ptr->value = 10;  // 使用 operator->() 访问 MyClass 对象的成员// 调用 MyClass 对象的成员函数ptr->print();return 0;
}

在这个示例中,我们首先定义了一个 MyClass 类,它有一个成员变量 int value 和一个成员函数 void print()。然后,我们使用 std::unique_ptr 来管理一个 MyClass 对象。

通过 ptr->value = 10; 和 ptr->print();,我们可以使用 std::unique_ptr 的 operator->() 运算符来访问和操作 MyClass 对象的成员。ptr->value = 10; 设置了 MyClass 对象的 value 成员为 10,而 ptr->print(); 调用了 MyClass 对象的 print 成员函数。

这个示例展示了如何使用 std::unique_ptr 和 operator->() 来管理和操作智能指针管理的对象。**

3. add_lvalue_reference<element_type>::type 使用

typename add_lvalue_reference<element_type>::type operator*() const   // 解引用
{_GLIBCXX_DEBUG_ASSERT(get() != pointer());return *get();
}

在上述代码中,typename add_lvalue_reference<element_type>::type operator*() const 定义了一个解引用操作符 *,用于解引用智能指针。add_lvalue_reference 是一个模板类,它用于将一个类型转换为左值引用类型。在这里,它用于将 element_type 转换为左值引用类型。

element_type 是一个模板参数,它表示智能指针所指向的元素类型。add_lvalue_reference<element_type>::type 返回 element_type 的左值引用类型。左值引用是一种引用类型,它允许你修改被引用的对象。

operator* 函数的作用是返回指针所指向的元素的左值引用。这意味着,当你使用 * 操作符解引用智能指针时,你将得到一个可以修改元素的左值引用。

例如,如果 element_type 是 int,那么 add_lvalue_reference<element_type>::type 将返回 int&,即 int 类型的左值引用。

_GLIBCXX_DEBUG_ASSERT(get() != pointer()); 这行代码是一个断言,用于确保智能指针的值不是空指针。在解引用操作时,如果智能指针的值是空指针,程序将抛出一个异常,因为你不能对空指针解引用。

return *get(); 这行代码返回指针所指向的元素的左值引用。get() 函数返回智能指针的值。*get() 将返回智能指针所指向的元素的左值引用。

例如,如果 element_type 是 int,那么 *get() 将返回一个 int& 类型的左值引用,你可以通过这个引用修改 int 类型的值。

请注意,operator* 函数的返回类型是 add_lvalue_reference<element_type>::type,这意味着它返回的是 element_type 的左值引用类型。在使用 operator* 解引用智能指针时,你将得到一个可以修改元素的左值引用。
在这里插入图片描述
在这个例子中,我们首先定义了一个模板类 add_lvalue_reference,它的作用是将一个类型转换为左值引用类型。然后,我们定义了一个智能指针类 SmartPtr,它使用 add_lvalue_reference 模板类来实现解引用操作。

在 main 函数中,我们创建了一个整数对象 num,然后创建了一个 SmartPtr 对象 sp,并将其指向 num。然后,我们使用解引用操作符 * 解引用 sp,得到一个可以修改 num 值的左值引用 ref。最后,我们修改了 num 的值,并输出其新的值。

这个例子展示了如何使用 SmartPtr 类的解引用操作符 * 来获取一个可以修改元素的左值引用。

相关文章:

【unique_str 源码学习】

文章目录 &#xff11;&#xff0e;删除器定义2. operator->() 运算符重载3. add_lvalue_reference<element_type>::type 使用 基本原理这篇博主写的很详细 https://yngzmiao.blog.csdn.net/article/details/105725663 &#xff11;&#xff0e;删除器定义 deleter_…...

flask第一个应用

文章目录 安装一、编程第一步二、引入配置三、代码解析 安装 python环境安装的过程就不重复赘述了&#xff0c;flask安装使用命令pip install Flask即可&#xff0c;使用命令pip show Flask查看flask版本信息 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供…...

华为OD机试真题(Python/JS/C/C++)- 考点 - 细节

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。...

【C++刷题】力扣-#628-三个数的最大乘积

题目描述 给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 示例 示例 1 输入&#xff1a;nums [1,2,3] 输出&#xff1a;6示例 2 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;24示例 3 输入&#xff1a;nums […...

Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着工程教…...

基于微信小程序实现信阳毛尖茶叶商城系统设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用&#xff0c;需要通过网络来传输数据。传输协议可以有多种选择&#xff0c;但考虑到可靠性&#xff0c;一般默认采用TCP协议。为了屏蔽网络传输的复杂性&#xff0c;需要封装一个单独的数据传输模块用来收发二进制数据&#xff0c;这个单独模…...

大数据计算里的Broadcast Hash Join/Shuffle Hash Join/Sort Merge Join

文章目录 Broadcast Hash Join场景 Shuffle Hash Join场景 Sort Merge Join场景 Broadcast Hash Join 场景 大表和小小表&#xff0c;直接把B表加载到内存&#xff0c;然后读块1内容和内存中数据匹配 Shuffle Hash Join 场景 大表和小表JOIN &#xff0c;小表分块后能加载…...

Java - 手写识别; 如何用spring ai和大模型做手写识别教程

识别后的文字 利用大模型提升Java手写识别&#xff1a;更简单、更高效 在Java场景中&#xff0c;我们经常需要处理手写识别的问题。过去&#xff0c;这类需求主要依赖于OCR技术&#xff0c;但其效果并不总是稳定。随着大模型的发展&#xff0c;使用大模型进行java手写识别成为…...

【Linux】用户权限管理:创建受限用户并配置特定目录访问权限

本文详细介绍了如何在 Linux 系统中创建一个名为 agent 的新用户&#xff0c;并限制其在特定目录下的权限。通过使用 useradd 命令创建用户&#xff0c;并使用 usermod 命令将新用户添加到现有用户组中&#xff0c;确保其具有适当的权限。接着&#xff0c;通过 chown 和 chmod …...

pgsql表分区和表分片设计

在设计 PostgreSQL 表分区和表分片时&#xff0c;主要目标是提高查询性能、可扩展性和数据管理的效率。以下是一些关键的设计步骤和策略&#xff1a; 1. 分区策略 水平分片&#xff1a;选择按日期进行水平分片&#xff0c;每天一个分片。这种策略适用于具有时间序列数据的场景…...

灵动AI ——视频创作新引擎 开启视觉奇幻之旅

灵动AI视频官网地址&#xff1a;https://aigc.genceai.com/ 灵动AI 科技与艺术的完美融合之作。它代表着当下最前沿的影像技术&#xff0c;为我们带来前所未有的视觉盛宴。...

AI设计、作图、画画工具哪个好用?看完这篇你就知道怎么选了

Stable Diffusion Stable Diffusion 是由 Stability AI 推出的开源 AI 文本到图像生成模型&#xff0c;以其开放性和灵活性在 AI 视觉工具领域广受欢迎。与 DALL-E 或 Midjourney 等只能依赖云计算的工具不同&#xff0c;Stable Diffusion 支持本地运行&#xff0c;也广泛兼容多…...

【python ASR】win11-从0到1使用funasr实现本地离线音频转文本

文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本&#xff0c;以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…...

myqld二进制安装和破解数据库密码(linux)

安装和基本配置 1.首先把下载下来的mysql安装包放到本地这里下载的是5.7版本为演示 1&#xff09;解压 tar xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz -C /usr/local -把安装包解压到/usr/local cd /usr/local …...

防重方案-订单防重方案笔记

订单防重设计 订单重复提交概念解决方案前端防重机制后端防重机制利用Token机制基于数据库的唯一索引 Token机制方案介绍 其他 订单重复提交概念 重复提交指&#xff0c;连点按钮进行重复提交操作&#xff0c;不包括刷新后的重新下单&#xff0c;重新下单已非同一订单的概念。…...

HTML、JavaScript和CSS实现注册页面设计

目录 一、实现要求 二、实现页面图 1、注册页面 2.用户ID、用户名、口令验证成功后显示页面 三、用户ID、用户名、口令、确定口令验证逻辑js代码 1、验证用户ID 2、验证用户名 3、验证口令密码 四、总结 五、代码仓库 一、实现要求 综合使用HTML、JavaScript和CSS进…...

Counter对象的使用样例

1. Counter类的定义和功能说明 Counter是一个用于跟踪值出现次数的有序集合。它可以接收一个可迭代对象作为参数&#xff0c;并生成一个字典&#xff0c;其中包含每个元素作为键&#xff0c;其计数作为值。 2. 统计列表或字符串中元素的出现次数 示例代码&#xff1a; from…...

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…...

Python小白学习教程从入门到入坑------第十七课 内置函数拆包(语法基础)

一、内置函数 1.1 查看所有内置函数 内置函数&#xff1a;Python 提供了许多内置函数&#xff0c;这些函数无需导入任何模块即可直接使用。它们涵盖了各种用途&#xff0c;从数学运算到类型检查&#xff0c;再到输入输出操作等。 如何查看内置函数呢&#xff1f; 在Pycharm…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下&#xff0c;数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统&#xff0c;还是初创…...

claude3.7高阶玩法,生成系统架构图,国内直接使用

文章目录 零、前言一、操作指南操作指导 二、提示词模板三、实战图书管理系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 在线考试系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 四、感受 零、前言 现在很多AI大模型可以…...

多线程语音识别工具

软件介绍 本文介绍一款支持大厂接口的语音转文字工具&#xff0c;具备免配置、免费使用的特点。 软件特性 该工具是一款完全免费的桌面端应用程序&#xff0c;部署于开源社区平台&#xff0c;其核心优势在于整合了多家技术供应商的接口资源。 操作方式 用户只需将音频…...

SpringBoot十二、SpringBoot系列web篇之过滤器Filte详解

一、前言 JavaWeb三大组件Servlet、Filter、Listener&#xff0c;其中之一便是过滤器Filter。 其实&#xff0c;Filter我们平常用的不多&#xff0c;一般多为项目初期搭建web架构的时候使用&#xff0c;后面用的就少了&#xff0c;在日常业务开发中不太可能碰到需要手写Filte…...