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

条款6:auto推导若非己愿,使用显式类型初始化惯用法

一、代理类

所谓的代理类就是以模仿和增强一些类型的行为为目的存在的类

class MyArray
{
public:class MyArraySize{public:MyArraySize(int size) : theSize(size) {}int size() const { return theSize; }operator int() const { return theSize; }private:int theSize;};MyArray(MyArraySize size) : size_(size), data_(new int[size.size()]) {}int operator[](int index){return data_[index];}bool operator==(const MyArray &temp){return data_ == temp.data_;}MyArraySize size() { return size_; }private:int *data_;MyArraySize size_;
};class MyArray_
{
public:// C++ 11之前没有explicitMyArray_(int size) : size_(size), data_(new int[size]) {}private:int *data_;int size_;
};void func1(MyArray arr)
{
}void func2(MyArray_ arr)
{
}int main()
{func2(10);func1(10);  // 错误,不能进行两次类型转换func1(MyArray(10)); // 通过代理类,可以避免上面隐式转换的情况return 0;myArray arr(10);auto size = arr.size();  // auto 推导为MyArray::MyArraySizeint size_ = arr.size();  // 因为存在operator int()隐式类型转换
}

二、临时变量的引用不要用引用来接

#include <vector>
#include <iostream>class A
{
public:A() { std::cout << "A::A()" << std::endl; }A(int data) : _data(data) { std::cout << "A::A(int data)" << std::endl; }A(const A &a) : _data(a._data){std::cout << "A::A(const A &a)" << std::endl;}A(A &&a) : _data(a._data){std::cout << "A::A(A &&a)" << std::endl;}~A() { std::cout << "A::~A()" << std::endl; }int _data{100};
};std::vector<A> func()
{return {A(1), A(2), A(3), A(4), A(5)};
}int main()
{A aaa = func()[2];    // 发生拷贝A &bbb = func()[3];   // 错误,引用了一个临时变量return 0;
}
#include <vector>
#include <iostream>std::vector<bool> features()
{return {true, true, true, false, false};
}int main()
{bool highPriority = features()[4];auto highPriority = features()[4]; // 错误写法,推导为引用类型的代理类// auto推到为std::vector<bool>::reference// reference在vector中其实是一个代理类auto highPriority_ = static_cast<bool>(features()[4]);return 0;
}

三、expressin template

#include <cassert>
#include <iostream>
#include <vector>template <typename Derived>
void func(Base<Derived> derived)
{derived.name();
}// https://blog.csdn.net/HaoBBNuanMM/article/details/109740504
// CRTP中的基类模板
template <typename E>
class VecExpression
{
public:// 通过将自己static_cast成为子类,调用子类的对应函数实现实现静态多态double operator[](size_t i) const { return static_cast<E const &>(*this)[i]; }size_t size() const { return static_cast<E const &>(*this).size(); }
};// 将自己作为基类模板参数的子类 - 对应表达式编译树中的叶节点
class Vec : public VecExpression<Vec>
{std::vector<double> elems;public:double operator[](size_t i) const { return elems[i]; }double &operator[](size_t i) { return elems[i]; }size_t size() const { return elems.size(); }Vec(size_t n) : elems(n) {}Vec(std::initializer_list<double> init){for (auto i : init)elems.push_back(i);}// 赋值构造函数可以接受任意父类VecExpression的实例,并且进行表达式的展开// (对应表达式编译树中的赋值运算符节点)template <typename E>Vec(VecExpression<E> const &vec) : elems(vec.size()){for (size_t i = 0; i != vec.size(); ++i){elems[i] = vec[i];}}
};// 将自己作为基类模板参数的子类 - 对应表达式编译树中的二元运算符输出的内部节点
// 该结构的巧妙之处在于模板参数E1 E2可以是VecSum,从而形成VecSum<VecSum<VecSum ... > > >的嵌套结构,体现了表达式模板的精髓:将表达式计算改造成为了构造嵌套结构
template <typename E1, typename E2>
class VecSum : public VecExpression<VecSum<E1, E2>>
{E1 const &_u;E2 const &_v;public:VecSum(E1 const &u, E2 const &v) : _u(u), _v(v){assert(u.size() == v.size());}double operator[](size_t i) const { return _u[i] + _v[i]; }size_t size() const { return _v.size(); }
};// 对应编译树上的二元运算符,将加法表达式构造为VecSum<VecSum... > >的嵌套结构
template <typename E1, typename E2>
VecSum<E1, E2> const operator+(E1 const &u, E2 const &v)
{return VecSum<E1, E2>(u, v);
}// 主函数入口
int main()
{// 创建3个叶子节点Vec v0 = {1.0, 1.0, 1.0}; Vec v1 = {2.0, 2.0, 2.0}; Vec v2 = {3.0, 3.0, 3.0}; auto v4 = v0 + v1;  //auto 推导为VecSum<Vec, Vec> v4,这也是一个代理类// 如果想要的不是这种类型// 解决方案1Vec v4 = v0 + v1;// 解决方案2auto v4 =static_cast<Vec>( v0 + v1);return 0;
}

相关文章:

条款6:auto推导若非己愿,使用显式类型初始化惯用法

一、代理类 所谓的代理类就是以模仿和增强一些类型的行为为目的存在的类 class MyArray { public:class MyArraySize{public:MyArraySize(int size) : theSize(size) {}int size() const { return theSize; }operator int() const { return theSize; }private:int theSize;};…...

蓝桥杯物联网开发板硬件组成

第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产&#xff0c;该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计&#xff0c;芯片提供了25…...

视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…...

(aaai2025) FD2-Net: Frequency-Driven Feature Decomposition Network

论文&#xff1a;FD2-Net: Frequency-Driven Feature Decomposition Network for Infrared-Visible Object Detection 代码&#xff1a;https://github.com/like413/FD2-Net 这个论文核心思想认为&#xff1a;多源融合目标检测方法忽略了频率上的互补特征&#xff0c;如可见光图…...

深度学习之目标检测——RCNN

Selective Search 背景:事先不知道需要检测哪个类别,且候选目标存在层级关系与尺度关系 常规解决方法&#xff1a;穷举法&#xff0c;在原始图片上进行不同尺度不同大小的滑窗&#xff0c;获取每个可能的位置 弊端&#xff1a;计算量大&#xff0c;且尺度不能兼顾 Selective …...

2014年IMO第3题

在凸四边形 A B C D ABCD ABCD 中, ∠ A B C = ∠ A D C = π 2 \angle ABC=\angle ADC=\frac{\pi}{2} ∠ABC=∠ADC=2π​, H H H 为 A A A 在 B D BD BD 上的投影, 在边 A B AB AB 上有一点 S S S, ∠ C H S − ∠ C S B = π 2 \angle CHS-\angle CSB=\frac{\pi}{2} …...

国高材服务 | 高分子结晶动力学表征——高低温热台偏光显微镜

众所周知&#xff0c;聚合物制品的实际使用性能&#xff08;如光学透明性、硬度、模量等&#xff09;与材料内部的结晶形态、晶粒大小及完善程度有着密切的联系&#xff0c;因此&#xff0c;对聚合物结晶形态等的研究具有重要的理论和实际意义。 随着结晶条件的不用&#xff0c…...

跨站请求伪造之基本介绍

一.基本概念 1.定义 跨站请求伪造&#xff08;Cross - Site Request Forgery&#xff0c;缩写为 CSRF&#xff09;漏洞是一种网络安全漏洞。它是指攻击者通过诱导用户访问一个恶意网站&#xff0c;利用用户在被信任网站&#xff08;如银行网站、社交网站等&#xff09;的登录状…...

Hadoop集群(HDFS集群、YARN集群、MapReduce​计算框架)

一、 简介 Hadoop主要在分布式环境下集群机器&#xff0c;获取海量数据的处理能力&#xff0c;实现分布式集群下的大数据存储和计算。 其中三大核心组件: HDFS存储分布式文件存储、YARN分布式资源管理、MapReduce分布式计算。 二、工作原理 2.1 HDFS集群 Web访问地址&…...

单元测试(UT,C++版)经验总结(gtest+gmock)

最近做了一段测试工作&#xff0c;其中包括单元测试&#xff0c;编程语言是C。这里提供一些基本知识总结&#xff0c;方便入门单元测试。 1.单元测试介绍 单元测试&#xff08;Unit Testing, 简称UT&#xff09;是软件测试的一种方法&#xff0c;目的是通过对单个软件组件&am…...

Mysql高级部分总结(二)

MySQL的内部日志 binlog记载的是update/delete/insert这样的SQL语句,而redo log记载的是物理修改的内容(xxxx页修改了xxx)。 binlog无论MySQL用什么引擎,都会有,而redo log是MySQL的InnoDB引擎所产生的。 redo log事务开始的时候,就开始记录每次的变更信息,而binlog是在…...

纠正一下网络管理

先找到那个hrStorageType 这里我的值是 后面的值.1.3.6.1.2.1.25.2.1.4代表磁盘 我只有2个盘 C盘和D盘 所以这里只有2个 你们有E盘F盘的话 这里会多 .1.3.6.1.2.1.25.2.1.2 代表内存 .1.3.6.1.2.1.25.2.1.2 前面是 hrStorageType.4 所以 这里面.4后缀是表示内存的 之前…...

homebrew,gem,cocoapod 换源,以及安装依赖

安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 再按照成功提示配置环境变量 ruby 更新ruby到最新 brew install ruby 如果安装了会自动升级 安装完成后根据提示配置环境变量 再执行命令使其生效 s…...

Java字符串的|分隔符转List实现方案

字符串处理 问题背景代码实现代码优化原因分析实现方案 注意事项异常处理Maven未识别异常 问题背景 在项目组对账流程中&#xff0c;接收对方系统的对账文件&#xff0c;数据以|为分隔符&#xff0c;读取文件内容&#xff0c;分条入库。 代码实现 Java中将字符串转给list&am…...

Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)

数据的存储是基于 主题&#xff08;Topic&#xff09; 和 分区&#xff08;Partition&#xff09; 的 Kafka是一个高可靠性的分布式消息系统&#xff0c;广泛应用于大规模数据处理和实时, 为了更方便地管理和监控Kafka集群&#xff0c;开发人员和运维人员经常需要使用可视化工具…...

DeepWalk 原理详解

概述&#xff1a; DeepWalk 是一种流行的图嵌入方法&#xff0c;用于学习图结构数据中节点的低维表示。它通过将图的节点视作序列数据&#xff0c;利用自然语言处理中的技术&#xff08;类似于word2vec算法&#xff09;来捕捉节点间的关系&#xff0c;可以帮助我们理解和利用图…...

GitLab安装|备份数据|迁移数据及使用教程

作者&#xff1a; 宋发元 最后更新时间&#xff1a;2024-12-24 GitLab安装及使用教程 官方教程 https://docs.gitlab.com/ee/install/docker.html Docker安装GitLab 宿主机创建容器持久化目录卷 mkdir -p /docker/gitlab/{config,data,logs}拉取GitLab镜像 docker pull gi…...

嵌入式linux驱动框架 I2C系统驱动程序模型分析

引言&#xff1a;在嵌入式 Linux 系统中&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种常用的通信协议&#xff0c;用于连接低速设备&#xff08;如传感器、显示器、存储器等&#xff09;与主控制器。I2C 系统驱动程序模型通过层次化的设计&#xff0…...

深度学习实验十七 优化算法比较

目录 一、优化算法的实验设定 1.1 2D可视化实验&#xff08;被优化函数为&#xff09; 1.2 简单拟合实验 二、学习率调整 2.1 AdaGrad算法 2.2 RMSprop算法 三、梯度修正估计 3.1 动量法 3.2 Adam算法 四、被优化函数变为的2D可视化 五、不同优化器的3D可视化对比 …...

一个双非选手的秋招总结

个人bg介绍 25届双非本硕&#xff08;非杭电深大&#xff0c;垫底双非&#xff09;&#xff0c;两段实习经历&#xff0c;本科没学过Java&#xff0c;有c语言和408基础&#xff1b;2023年10月份中途转语言&#xff0c;Java速成选手。 战绩总结&#xff1a;实习秋招面试总论次…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...