C++之模板实例化

2023-11-19

模板可以分为类模板与函数模板,它们的声明形式分别为:template<typename T1,typename T2,int Size> Class 类名;

                                                                                                        template<typename T1...> 返回值类型 函数名(形参表);

其中typename后跟的是类型参数,可以是内置类型,也可以是自定义类型,像Size这种为非类型参数,为固定值。

模板在没有被实例化的情况下是不会生成二进制代码的,其实例化分为三种方式,分别是:

1.隐式实例化

这种实例化是针对函数模板而言的,在发生函数调用时,编译器会先去寻找形参完全匹配的函数,如果没有找到,会对同名的函数模板进行推演,如果推演成功则隐式实例化该模板并完成调用,如果推演失败,则会去调用低一级的匹配函数,如下例所示。

#include<iostream>
using namespace std;
template <typename T>
void func(T t){
cout<<t<<endl;
}
template <typename T>
class A{
T num;
public:
A(){
num=T(6.8);
}
void invoke(void(*p)(T)){
p(num);
}
};
int main(){
A<int>a1;//类的显示模板实参
a1.invoke(func);//函数的隐式实例化
A<double>a2;
a2.invoke(func);
}

在主函数里两次调用了func函数,由于普通函数func的声明并不存在,只存在函数模板func的定义,因此会对func函数模板进行推演,若推演能获得成功,则将函数模板隐式实例化,在本例中分别将func模板隐式实例化为void func<int>(int t)及void func<double>(double t),编译后程序里将会存在这两个函数的二进制代码。

2.显示模板实参,下面给出一段程序。

#include <iostream>
using namespace std;
template <typename T> T Max (const T& t1,const T& t2){
return (t1>t2)?t1:t2;
}
int main(){
int i=5;
Max (i,'a');//调用失败
Max<int>(i,'a');//显示模板实参
}
直接调用函数Max(i,'a')会失败,这是因为i与‘a’具有不同的类型,在进行函数模板推演的时候会失败,而如果使用显示模板实参Max<int>(i,'a')则直接把模板实例化了,不需要再经过参数推演,并且char型参数'a'会隐式转化为int类型。

3.显式实例化

即在未发生函数调用的时候就将函数实例化,或者在为使用模板类时将类实例化,假设有函数模板template <typename T> void A (const T&)和类模板template <typename T> class B,则其显式实例化分别为:

函数模板的显式实例化:template void A<int> (const int&);

类模板的显式实例化:template class B<int>;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之模板实例化 的相关文章

  • leetcode刷题(77)——312. 戳气球

    一 题目 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 每当你戳破一个气球 i 时 你可以获得 nums left nums i nums right 个硬币 这里
  • jenkins项目配置的gitee显示无法连接到仓库

    jenkins项目配置的gitee显示无法连接到仓库 stderr fatal Unable to read current working directory No such file or directory 排查了半天发现git配置啥
  • CryptoJS 加密的使用方法

    因为公司的项目中用到了接口加密解密 所以百度了一下前端JS加密相关的文章 发现谷歌的CryptoJS挺好用的 因为项目用的是vue框架 记录一下项目中使用经验 首先使用npm安装CryptoJS npm install crypto js
  • 趣味数学问题的算法实现

    一 袋鼠跳跃问题 问题描述 有一只袋鼠 它跳跃一次的方式只有两种 一次跳1米 一次跳3米 现在有一段10米长的路 袋鼠从起点开始跳 问到终点有多少种不同的跳跃方式 问题分析 10米其实通过枚举就能够计算出来 但是我们要做的是给出计算任何距离
  • 玄子Share-自然语言编程(NLP)_导读篇

    玄子Share 自然语言编程 NLP 导读篇 自然语言编程 Natural Language Programming 提示工程 Prompt Engineering Prompt Engineering 介绍 Prompt Engineer
  • 软件需求工程R 第十章

    第十章 需求获取方法之观察与文档审查 常见的观察方法 1 采样观察 Sampling Observation 传统 简单的观察方法 2 民族志 Ethnography 深入到用户中 长期 浸入式的观察方法 3 话语分析 Discourse
  • 比特酒吧

    目前 区块链技术这个词非常的火爆 不少人动辄就会拿出区块链大书特书 说如何如何能够改变现有的金融模式 可是真正能够把区块链解释清楚的很少 以科学化的语言来解释区块链 区块链就是把加密数据 区块 按照时间顺序进行叠加 链 生成的永久 不可逆向
  • 停车收费系统服务器,无人值守停车场自动收费 车牌识别微信支付系统介绍

    随着智能手机及移动终端的普及 智能手机几乎人手一部 这就给 支付宝等移动支付终端提供了很好的舞台 可以这么说 现在已经进入了移动支付时代 我们去饭店吃饭可以支付 加油站加油可以支付 现在可以移动支付的地方越来越多 收费停车场由于收费金额普遍
  • Linux 配置与磁盘管理

    目录 物理设备的命名规则 Linux中硬盘分区部分 Linux在分区上建立文件系统 挂载 Linux硬盘管理工具 LVM逻辑卷管理器 物理卷 卷组合逻辑卷的建立 逻辑卷的使用 LVM整体创建流程 硬盘配额配置 针对用户或者群组使用的空间 物
  • 用Python生成组织机构代码,附源码

    usr bin python import random def haoma ww 3 7 9 10 5 8 4 2 suan fa yin zi cc dd 0 for i in range 8 gei CC fu zhi cc appe
  • virtual box之前创建的虚拟机,打开黑屏的解决办法

    virtual box之前创建的虚拟机 打开后黑屏的解决办法 我第一次使用virtual box打开创建的虚拟机时显示黑屏 是因为分配的显存不够造成的 最后自己的解决方案如下 选中对应的虚拟机 然后在右侧详情页中点击 设置 按钮 在弹出的设
  • 怎样确定AD采样频率,跟转换时间有关吗。在单片机中如何设置采样频率。

    转自百度知道https zhidao baidu com question 295921974 html 采样频率的意思是单位时间的采样次数 要确定采样频率 应该根据被测模拟量的变化动态以及测量需求决定 对于特定的硬件环境以及转换位数来说
  • 机器人编程有等级考试吗?

    很多学习机器人编程的同学 都想通过等级考试来检验自己的学习效果 通过考试发现自己的学习短板 查漏补缺 如果能取得不错的成绩 对自己的学习自信心也会有非常大的提升 机器人编程有等级考试吗 今天小贝老师就来帮助大家解答这个问题 其实 机器人编程
  • Java基础知识强化08:将字符串倒序输出(包括空格)的几种方法

    1 最容易想到的估计就是利用String类的toCharArray 再倒序输出数组的方法了 1 package himi hebao05 2 3 public class TestDemo02 4 public static void ma
  • Idea解决Java获取properties文件中值

    Idea Springboot项目解决java 获取properties文件中的值 详解 一 在使用分布式时 java 获取properties值 这里值得注意的时 Value这个注解默认可以获取到application propertie
  • 测试导入JQuery是否成功,按钮切换案例

    MDN Plus html css javascript的中文文档 望月推荐 测试导入JQuery
  • 小白转行软件测试,面试3天接到3个offer,月薪10k(程序人生)

    简介 这篇文章主要介绍了小白转行软件测试 面试3天接到3个offer 月薪10k 示例代码 以及相关的经验技巧 值得大家参考 我叫小马 来自于河北保定 毕业以来一直对自己的人生充满了迷茫 一次偶然的机会让我重新找到了方向 2015年高中毕业
  • pandas之read_csv参数详解

    最近发现pandas强大的惊人 只是不懂 多走了很多歪路 浪费开发效率 准备好好总结一下pandas pandas read csv参数 Basic filepath or buffer various sep str defaults t
  • 【测试】三张图解读 CI/CD

    文章目录 前言 CI CD 的概述 CI持续集成 Continuous Integration 持续集成小结 CD 持续交付 Continuous Delivery 持续交付小结 CD 持续部署 Continuous Deployment
  • Robotframework-ride / selenium 浏览器驱动插件下载地址

    chromedriver 驱动下载地址 http chromedriver storage googleapis com index html geckodriver 驱动下载地址 https github com mozilla geck

随机推荐

  • Vue第5天知识点:promise:异步函数与回调函数的说明嵌套、promise基本语法、解决回调函数问题以及优化、封装axios的发送、面试题循环队列以及宏任务与微任务、async和await

    promise 异步函数 与 回调函数的说明 异步函数 定时器setTimeout ajax 异步函数的执行 不会阻塞主线程代码的执行 回调函数 把一个函数当成参数传递 将来特定的时机调用 这个函数就叫回调函数 什么时候会用到回调函数 异步
  • Python之pdf内容读取

    import pandas as pd import pdfplumber with pdfplumber open r C Users 2023 02 开发 pdf as pdf for page in pdf pages 输出文本内容
  • 给出三个整数,判断大小

    7 2 比较大小 给出三个整数 判断大小 输入格式 给出三个整数a b c 输出格式 在一行中依次从小到大的顺序输出 两数之间有一个空格 无多余空格 输入样例 在这里给出一组输入 例如 2 1 5 输出样例 在这里给出相应的输出 例如 1
  • 串口接收中断进不去,如何解决

    串口配置代码 void USART Configuration void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitStructure RCC APB2P
  • 自动化软件测试流程的七个步骤包括哪些内容

    自动化测试一般是指软件测试的自动化技术 自动化软件测试流程是把以人为驱动的测试行为转化为机器语言执行的一种过程 通常 在设计了测试用例并通过评审之后 由测试人员根据测试用例中描述的规程一步步执行测试 得到实际结果与期望结果的比较 在此过程中
  • Promise 捕获错误

    你好 我是南一 这是我在准备面试八股文的笔记 如果有发现错误或者可完善的地方 还请指正 万分感谢 前言 今天做项目时 遇到Promise抛出错误捕获不到的情况 然后我就去找了 阮一峰ES6入门重新学了一遍 又加深了对Promise的理解 分
  • 清除访问局域网密码缓存( samba )

    整了个samba的服务器 创建了两个用户 一个管理员用户 拥有全部的读写权限 另一个普通用户 只有部分文件夹得读写权限 xp在你第一次登录后会记住这个密码 以后登录都是直接登录 因此 给两个用户之间的切换带来不便 于是乎 找谷哥帮忙 谢谢谷
  • @前端vue-video-player 插件多视频获取后端数据的插件实践

    前端vue video player 插件多视频获取后端数据的插件实践总结 npm install npm install vue video player S 提醒 一定要用npm 一定要用npm 不要用cnpm 会报错 否则会报 The
  • 解决Android SDK / Android Studio(IntelliJ IDEA)更新不了(被墙)的问题

    昨天更新android sdk时 发现developer android com被墙了 手上也没有代理 再者android sdk manager更新有个不太好的地方是 只有一台机更新还好 但如果有多台机要更新 每台机都要重新下载一遍 那效
  • 神秘又强大的@SpringBootApplication注解

    一 前言 大部分的配置都可以用Java类 注解来代替 而在SpringBoot项目中见的最多的莫过于 SpringBootApplication注解了 它在每个SpringBoot的启动类上都有标注 这个注解对SpringBoot的启动和自
  • 解决VSCode中查看ESP32日志乱码

    问题现象 在VSCode的Monitor中查看ESP32输出的日志乱码 如下图 原因 在VSCode中IDF默认的Monitor串口波特率为460800 然而ESP32输出Log的串口波特率默认为115200 因串口波特率不匹配导致Moni
  • 墙裂推荐!pycharm装上这 14 个插件后,简直就是无敌的存在!!

    pycharm是一款强大的python集成开发环境 带有一整套python开发工具 今天就给大家介绍几款非常好用的插件 首先插件的下载方法 进入File gt Settings gt Plugins 根据需要搜索插件名称 记得是在Marke
  • jmeter 安装配置

    一 进入官网 http jmeter apache org 1 第一步进入官网如下图 2 选择进行下载 下载下来为一个压缩包 解压即可 3 下载完成后 然后就进行解压 要注意版本对应的java要求 解压完成后就要配置环境变量了 4 环境变量
  • C++中的compare比较字符串

    在C语言中的字符串比较使用的strcmp函数 但在C 中使用的是compare函数 格式 字符串A compare 字符串B 其中还可以指定子串比较 格式 A compare 0 3 B 4 3 说明字符串A中的从下标为0开始的3个字符和字
  • java中的NIO和IO

    今天看到一篇文章 其中提到了NIO 之前没使用过 今天拿出来学习下 做个个人分享 IO指的是流式处理 I对用的是Input O对应的是OutPut 也就是我们常用的IO IO流的数据来源可以是键盘 文件 网络等等 下面是其类图的划分 具体这
  • html字符实体

    比如我们想在网页上面显示一个 lt 小于符号 但是 lt 在HTML中是文档标记的开始语言 如果我们直接使用 lt 会出差错 所以我们就会一些实体名称来代替 显示结果 描述 实体名称 实体编号 空格 nbsp 160 lt 小于号 lt 6
  • python 无向图的生成

    import random n int input please input n m int input please input m v int input please input vote print int random unifo
  • Oracle联合查询详解

    联合查询 多表连接 概念 多张表连接 合并查询数据 分类 1 笛卡尔积连接 交叉连接 语法 select t1 column1 t1 column2 t2 column1 t2 column2 from table name1 t1 cro
  • CentOS在线安装MySQL,超细,易上手(附GPG密钥过期解决办法)

    MySQL 在线安装MySQL 1 下载 root localhost wget https dev mysql com get mysql57 community release el7 11 noarch rpm 2018 01 08
  • C++之模板实例化

    模板可以分为类模板与函数模板 它们的声明形式分别为 template