分析 vs2019 cpp20 规范的 STL 库模板 function ,源码注释并探讨几个问题

(1 探讨一)第一个尝试弄清的问题是父类模板与子类模板的模板参数的对应关系,如下图:

在这里插入图片描述

我们要弄清的问题是创建 function 对象时,传递的模板参数 _Fty , 传递到其父类 _Func_class 中时 ,父类的模板参数 _Ret 与 _Types 是什么样。这很关键。但模板实例化是发生在编译期间。编译器知道根据其自己定义的语法规则来确定这三个模板参数。所以即使是反汇编调试,也无法跟踪这个确定模板参数的过程。因此只能在模板的成员函数中增加一些打印语句,修改下库代码,如下图:

在这里插入图片描述

咱们猜测 , 当 function 的模板参数 _Fty = double ( char , int) 时,其父类模板的模板参数为 _Ret = double , _Types = { char , int }。
即 _Ret 见名知意时函数返回值的类型, _Types 是函数的参数类型。确实是这样的,在验证后。发生这么神奇的一幕,就在于那个承上启下的 宏定义 _Get_function_impl ,其有一个模板参数展开的动作。接着给出测试代码,首先是修改 reset 函数:

编写例子测试一下:

在这里插入图片描述

(2 探讨二) 再一个探讨的结论是:虽然创建的 function 对象绑定到某个函数类型。但实际为 function 对象赋值时候,可以采用兼容的函数类型,都可以的。只要实际待执行的函数类型的参数和返回值类型都兼容 function 模板参数的类型。测试如下:

在这里插入图片描述

因为数据的隐式类型转换是可以的,存在的。但不合理的类型转换,比如从 int 到 char 的转换,将导致代码行 13 报错,测试如下:

在这里插入图片描述

(3 探讨三) 函数的返回值可以从任意类型转换为 void 的类型,符合这个方向的函数,也可以绑定到 function 对象上,测试如下:

在这里插入图片描述

但反之则不成立。返回值为 void 的类型,不能转换为别的函数返回值类型。其实任意的函数返回值都不要求的话,就乱套了。测试如下

在这里插入图片描述

(4)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701576.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s的整体架构及其内部工作原理,以及创建一个pod的原理

一、k8s整体架构 二、k8s的作用,为什么要用k8s,以及服务器的发展历程 1、服务器:缺点容易浪费资源,且每个服务器都要装系统,且扩展迁移成本高 2、虚拟机很好地解决了服务器浪费资源的缺点,且部署快&#x…

短视频语音合成:成都鼎茂宏升文化传媒公司

短视频语音合成:技术革新与创意融合的新篇章 随着科技的飞速发展,短视频已经成为人们生活中不可或缺的一部分。在这个快速变化的时代,短视频语音合成技术正逐渐崭露头角,以其独特的魅力和广泛的应用前景,吸引了众多创…

助力数字农林业发展服务香榧智慧种植,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建香榧种植场景下香榧果实检测识别系统

作为一个生在北方但在南方居住多年的人,居然头一次听过香榧(fei)这种作物,而且这个字还不会念,查了以后才知道读音(fei),三声,这着实引起了我的好奇心,我相信…

【MARIE】嵌入式系统设计半期报告:MARIE模拟器的使用

1.模拟器介绍 1.1 体系结构 MARIE (Machine Architecture that is Really Intuitive and Easy) 是一种机器架构和汇编语言。发布者还为机器提供了一组用 Java 编写的模拟器程序。MARIE.js 是 MARIE 的 JavaScript 版本实现。它旨在尽可能忠实于原始 Ja…

java项目之教学辅助平台(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的教学辅助平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 教学辅助平台的主要使用者分…

flutter开发实战-compute将工作交由isolate处理

flutter开发实战-compute将工作交由isolate处理 最近查看flutter文档时候,看到了compute可以将工作交由isolate处理。通过 Flutter 提供的 compute() 方法将解析和转换的工作移交到一个后台 isolate 中。这个 compute() 函数可以在后台 isolate 中运行复杂的函数并…

第十一届蓝桥杯大赛软件类决赛 Java A 组

文章目录 发现宝藏【考生须知】试题 A: 合数个数试题 B : 含 2 天数试题 C: 本质上升序列试题 D: 迨尺天涯试题 E: 玩具蛇试题 F: 游园安排试题 G: 画廊试题 H: 奇偶覆盖试题 I: 补给试题 J: 蓝跳跳 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&…

Spring Cloud系列—Spring Cloud Gateway服务网关的部署与使用指南

Gateway网关 文章目录 Gateway网关1. 网关基本简介1.1 什么是网关1.2 为什么需要网关? 2. 快速搭建gateway网关2.1 创建新模块2.2 引入依赖2.3 编写启动类2.4 配置路由规则2.5 测试 3. 路由过滤4. 过滤器4.1 简介4.2 网关过滤器4.2.2 种类 4.3 自定义过滤器4.3.1 自…

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻…

从零开始:C++ String类的模拟实现

文章目录 引言1.类的基本结构2.构造函数和析构函数3.基本成员函数总结 引言 在C编程中,字符串操作是非常常见且重要的任务。标准库中的std::string类提供了丰富且强大的功能,使得字符串处理变得相对简单。然而,对于学习C的开发者来说&#x…

目标检测算法YOLOv6简介

YOLOv6由Chuyi Li等人于2022年提出,论文名为:《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》,论文见:https://arxiv.org/pdf/2209.02976 ,项目网页:https://github.c…

【学习笔记】C++每日一记[20240513]

简述静态全局变量的概念 在全局变量前加上static关键字,就定义了一个静态全局变量。通常情况下,静态全局变量的声明和定义放在源文件中,并且不能使用extern关键字将静态全局变量导出,因此静态全局变量的**作用于仅限于定义静态全…