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号上午也就是今天我起了个大早,然后把昨天的尾巴收了一下,没收完,先说说成果: 完成了…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...