2310C++构造对象
原文
本文展示一个构造对象
方式,用户无需显式
调用构造器.对有参
构造器类,该实现在构造改对象
时传递默认值
来构造.
当然用户也可指定(绑定
)某个参数的值.实现思路
参考boost-ext/di
的实现.看下示例:
构 成员{整 x=10;
};
构 成员1{整 x=11;
};
类 例子1{
公:例子1(成员 x,成员1 x1){输出<<x.x<<行尾;//10输出<<x1.x<<行尾;//11}
};
整 主(){动 e1=远前::对象创建者<>().元 创建<例子1>();
}
示例比较简单,构造一个对象创建者
对象,并调用他的创建
来创建一个例子1
的对象,因为使用对象创建者
来构造,所以不需要传递参数
,它会自动构造
.
好处是,构造对象
时,可无需考虑该对象构造器
是几个参数或类型
,想要增加参数
时,无需修改代码
,当然指定参数
的话除外.
该用法
也叫依赖注入
.
构思主体实现
还蛮酷炫,看看如何做到的?先来说下主体想法
,首先最重要的当然是对象创建者
,该类如何知道要构造
对象的构造器
的参数类型
是什么呢,知道参数类型
才能构造一个参数
传递,同时参数
也同样需要对象创建者
来构造,依次递归
.
上边说到了有两个
问题要解决,第一个
就是如何识别
构造器的参数类型
,第二个是要构造构造器参数
时,如果递归构造
?
识别构造器参数类型
使用任何类型
来识别构造器参数
,简单示例:
构 任何类型{元<型名 T>符号 T(){中 T{};}
};
构 成员{};
构 例子{例子(成员 m,整){}
};
整 主(){例子(任何类型(),2);中 0;
}
调用任何类型()
可匹配至任意类型
,然后在构造例子
时,编译器会去找相应类型
来构造.大家可能发现我使用的是多个
参数来举例任何类型
,如果参数是单个任何类型
会有冲突
,因为拷贝构造器
也是一个参数,所以编译器
会识别冲突,该问题后边也要处理
.
类 例子{
公:例子(成员 m){输出<<m.x<<行尾;}
};
整 主(){例子 e(任何类型{});中 0;
}
//--------以下报错
注意:候选人:'例子::例子(成员)'
|例子(成员 m){
|^~~~~~~
:注意:候选人:'常式 例子::例子(常 例子&)'
类 例子{
递归构造构造器的参数
因为构造器
参数可能是个类对象
,该对象的构造器参数
又是其他
类对象,识别类型
后,继续调用函数
来构造该对象
,以此类推.
保存绑定参数
当然使用过程也不全部是使用默认构造
,可能也需要传递指定参数
与构造器参数
绑定,但是构造器的参数类型
又是多样的.
这里先用元组
来保存,若识别出来的类型
和保存
数据类型是一致
的,则不用构造
而是直接传递该数据
给构造器.
代码实现
开始写代码,肯定有个任何类型
的类及对象创建者
的类.对象创建者
用来构造对象返回
,会只用任何类型
类来识别
类型.
对象创建者
大概看下具体的实现:
元<型名...O>
类 对象创建者{
公:元<型名...T>显 对象创建者(T&&...o):依赖_(前向<T>(o)...){}
//...
私:元组<常 O&...>依赖_;
};
用元组
保存要绑定
参数时,要保存
数据就得拷贝
,这里为了避免拷贝
,元组
中类型是常
左引用,但这样就得用户自己
来维护要绑定
参数的生命期.
O
是要绑定
参数类型,构造器中为了避免拷贝
,用完美转发
来实现.依赖_
就是保存绑定参数
的数据结构
.
元<型名...O>
类 对象创建者{
//...
元<型名 T>T 创建(){如 常式((是相同<T,O>::值||...)){中 取<常 T&>(依赖_);}异 如 常式(是可默认构造值<T>){中 T{};}异 如 常式(是可构造<T,任何第一引用类型<对象创建者,T,远前无效,O...>>::值){中 T{任何第一引用类型<对象创建者,T,远前无效,O...>{本}};}异 如 常式(是可构造<T,任何第一类型<对象创建者,T,远前无效,O...>>::值){中 T{任何第一类型<对象创建者,T,远前无效,O...>{本}};}异{中 创建多参对象<T>(造引序<10>{});}
}
//...
};
这里就是创建
函数了:
1,首先判断是不是已绑定了要创建的类对象
,如果绑定
了,则直接从元组
中取出返回.
2,未绑定的话,再判断是否可构造
默认构造(即可无参
构造),可以的话返回空对象
.
3,然后判断是不是参数构造器
,参数这里分成了两种
,是引用
类型或非引用
类型.因为,识别T
和T&
会引起冲突,所以分开处理.举例说明:
构 任何类型{元<型名 T>符号 T(){中 T{};}元<型名 T>符号 T&(){中 T{};}
};
类 例子{
公:例子(成员 m,整){输出<<m.x<<行尾;}
};
例子 e(任何类型{},7);
//报错如下:
错误:转换 从'任何类型'到'成员'是 歧义
例子 e(任何类型{},7);
^~~~~~~~~
候选:'任何类型::符号 T()[带 T=成员]'
符号 T(){
^~~~~~~~
注意:候选:'任何类型::符号 T&()[带 T=成员]'
符号 T&(){
4,最后是构造多参
构造器,分开一个
参数和多个
参数的原因是,一个
参数需要处理拷贝构造器
及单参
构造器冲突,按参数给创建多参对象
函数传递了1~10
的整数序列
,表示目前最多只能支持10
个参数的构造器
.
继续看多参
的构造:
元<型名 T,大小型...N>
T 创建多参对象(常 引序<N...>&){如 常式(是可构造值<T,在<任何引用类型<对象创建者,远前无效,O...>,N>...>){中 T{在<任何引用类型<对象创建者,远前无效,O...>,N>{本}...};}异{中 创建多参对象<T>(造引序<的大小...(N)-1>{});}
}
首先判断是否可由多个任何引用类型
类型来构造,尽量,直接构造对象
,否则,就减少参数个数
来重新匹配.
任何类型
然后再观察如何编写任何类型
,先看任何第一类型
的情况.为了避免和拷贝构造器
冲突,简单优化下:
构 任何第一类型{元<型名 T,型名=允许如型<!是相同值<源,T>>>常式 符号 T(){中 创建者_->元 创建<T>();}};
使用替失非错
来先排除构造拷贝器
,用任何第一类型
识别参数类型
时,需要按模版参数
传递要构造的类给源
,让T
与源
不一样,进而告诉编译器
要调用的不是拷贝构造器
而是其他
函数.
创建者_
就是对象创建者
对象,构造
参数递归
调用创建
函数.多参
也是类似
,只是不需要额外判断拷贝构造器
.
还要注意
,如果构造器
类型是引用
类型,在和绑定参数
匹配时,会多一次拷贝,所以还要区分.
元<型名 创建者,型名 源,型名...O>
构 任何第一引用类型{元<型名 T,型名=允许如型<!是相同值<源,退化型<T>>>,型名=允许如型<(是相同<退化型<T>,O>::值||...)>>常式 符号 T&(){中 常转<T&>(创建者_->元 取依赖<T>());}元<型名 T,型名=允许如型<!是相同值<源,退化型<T>>>,型名=允许如型<(是相同<退化型<T>,O>::值||...)>>常式 符号 T&&(){中 静转<T&&>(常转<T&>(创建者_->元 取依赖<T>()));}创建者*创建者_=空针;
};
在和绑定参数
匹配,且传递引用
时,单独
实现,直接返回
,而不再调用创建者
的创建
函数,并且强制转化
.多参
类型识别也是类似
.
源码在此
相关文章:
2310C++构造对象
原文 本文展示一个构造对象方式,用户无需显式调用构造器.对有参构造器类,该实现在构造改对象时传递默认值来构造. 当然用户也可指定(绑定)某个参数的值.实现思路参考boost-ext/di的实现.看下示例: 构 成员{整 x10; }; 构 成员1{整 x11; }; 类 例子1{ 公:例子1(成员 x,成员1 x…...

nginx多文件组织
背景: nginx的话,有时候,想部署多个配置,比如:使用不同的端口配置不同的web工程。 比如:8081部署:项目1的web页面。 8082部署:项目2的web页面。 1)nginx.conf worker_processes…...

扩容LVM卷导致lvm元数据丢失的恢复过程
一、问题描述 因某次MySQL binlog占用过高扩容时,是直接对云盘操作,而扩容直接操作了lvm卷而未操作云盘分区,并随后执行了扩容的partprobe,resize2fs卷等操作;最后,显示并未扩容成功,重启系统后…...

【MySQL教程】| (1-1) 2023MySQL-8.1.0 安装教程
文章目录 一、安装包下载二、安装配置1、解压安装包2、编写MySQL配置文件3、初始化MySQL数据库3、安装mysql服务并启动4、MySQL服务5、连接MySQL6、修改密码 三、配置环境变量四、防止mysql自启动拖慢开机时间 近日有粉丝问到mysql在win11的安装中遇到一些问题,应粉…...
数据大屏定时请求后端数据
需求: 因为大屏基本从上午展示到晚上,不会频繁去打开页面。 前端实现: 在Vue的created钩子函数中发送初次请求,并使用JavaScript中的setInterval函数来设置整点定时发送请求。以下是一个示例 <template><div><h1…...

数据结构--队列
一、队列是什么 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表。进行插入操作的端称为队尾&…...

Python绘图系统25:新增8种绘图函数
文章目录 常用绘图函数单选框的更改逻辑源代码 Python绘图系统: 前置源码: Python打造动态绘图系统📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制📈四 定制绘图风格 📈五 数据生成导…...

(二) gitblit用户使用教程
(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 网页访问git客户端设置推送错误配置查看当前配置 日常使用仓库分组my profile修改上传代码简洁 网页访问 点击Advanced... 点击Accept the Risk and Contiue 初始用户名和密码都是admin,点击login…...

8.3Jmeter使用json提取器提取数组值并循环(循环控制器)遍历使用
Jmeter使用json提取器提取数组值并循环遍历使用 响应返回值例如: {"code":0,"data":{"totalCount":11,"pageSize":100,"totalPage":1,"currPage":1,"list":[{"structuredId":&q…...

SNERT预备队招新CTF体验赛-Misc(SWCTF)
目录 1、最简单的隐写 2、旋转我 3、is_here 4、zip伪加密 5、压缩包密码爆破 6、我就藏在照片里 7、所以我放弃了bk 8、套娃 9、来自银河的信号 10、Track_Me 11、勇师傅的奇思妙想 1、最简单的隐写 下载附件后,图片格式并不支持打开 根据题目提示&…...

MySql017——组合查询
一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔ÿ…...
【0224】源码分析RelFileNode对smgr访问磁盘表文件的重要性(2)
1. RelFileNode的角色 RelFileNode 是一个结构体数据类型,声明于relfilenode.h(src\include\storage )头文件中,该数据类型十分重要,因为它 “提供所有我们需要知道的物理访问关系表的信息。” smgr要访问磁盘上面的数据表文件,则需要此RelFileNode提供必要信息。 可以说…...
2310C++λ中完美转发
原文 C11里面就引入了完美转发概念,通过它,可按参数实际类型转发参数. 元<型名 T>空 处理(T&t){输出<<"左值\n";} 元<型名 T>空 处理(T&&t){输出<<"右值\n";} 元<型名 T>空 测试转发(T&&t){处理(前向&…...
【C++11】std::function 包装器(又叫适配器),std::bind 绑定
文章目录 std::function 包装器1. 使用方法2. 包装器的应用场景:题目 - - 逆波兰表达式求值3. 成员函数 和 static 静态成员函数 使用 包装器 std::bind 适配器绑定1. 使用方法2. 调整参数 顺序3. 指定参数 / 参数个数的调整 std::function 包装器 std::function 包…...

Linux系统编程系列之线程
一、什么是线程 线程(Thread)是计算机中的基本执行单元,是操作系统调度的最小单位。线程是进程内的一个独立执行流程,一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程都有自己的独立栈空间以及…...

CV面试知识点总结
一.卷积操作和图像处理中的中值滤波操作有什么区别? 1.1卷积操作 卷积操作是一种线性操作,通常用于特征的提取,通过卷积核的加权求和来得到新的像素值。1.2中值滤波 原文: https://blog.csdn.net/weixin_51571728/article/detai…...

Centos一键安装、切换各版本JDK
查看服务中的安装的jdk rpm -qa | grep java获取jdk各版本信息 yum -y list java*查看指定版本 yum -y list java*|grep 1.8安装jdk yum install java-11-openjdk当服务器中有多个版本jdk,切换指定jdk版本 alternatives --config java按照提示输入编号即可切换&…...

JavaWeb项目:smbms(mysql)
1.准备工作,创建数据库 CREATE DATABASE smbms;USE smbms;CREATE TABLE smbms_address (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,contact VARCHAR(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 联系人姓名,addressDesc VARCHAR(50) COLLATE u…...
shell脚本的多线程介绍
shell脚本的多线程介绍 shell脚本中,实现多线程可以使用以下方法: 1)使用&符号 在Shell中,可以使用&符号将命令放在后台执行,这样就可以同时执行多个命令。例如: #!/bin/bash command1 & #…...

周记之反思
9.25 这篇总结我承认,是在26号上午写的,那昨天晚上又聊天了,但是对比之前来说好很多了,所以26号上午也就是今天我起了个大早,然后把昨天的尾巴收了一下,没收完,先说说成果: 完成了…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
HTML中各种标签的作用
一、HTML文件主要标签结构及说明 1. <!DOCTYPE html> 作用:声明文档类型,告知浏览器这是 HTML5 文档。 必须:是。 2. <html lang“zh”>. </html> 作用:包裹整个网页内容,lang"z…...