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

【类模板】模板参数的推断

一、模板参数的推断

我们在实例化一个类模板的时候,有两种方法:

一种是使用 < T > <T> <T>来显式推断生成相应的类
另一种是不使用 < T > <T> <T>来隐式推断生成相应的类

具体如下:

template<typename T>
struct A {T val1, val2;A(T val1_, T val2_) : {}
};void Test() {A(1, 1); //隐式推断A<int>(1, 1); //显式推断
}

其中,两种推断方案都基于构造函数,如果我们删除了构造函数,那么我们就无法生成相应的类。

二、模板参数的推断指南

1.隐式推断

模板的推断指南(deduction guide),是C++17引入的概念。
推断指南主要是用来在推断模板参数时提供推断指引。

通常情况下,编译器自带一个推断指南,形式上如:

//隐式推断
template<typename T>
A(T, T) -> A<T>;

所以,即使我们只要有构造函数,也可以不写这个推断指南,也能生成相应的类。

对于这个类

template<typename T>
struct B {T val1, val2;B(T val1_, T val2_) : {}
};

如果我们调用

void Test2() {B(1, 1); //调用隐式推断,推断为B<int>
}

那么将会实例化一个 i n t int int类型的 B B B类,因为此时调用的是默认的推断指南

2.自定义推断

但如果我们想要让其推断为 d o u b l e double double类型呢?
此时需要自定义一个推断指南,如下:

//显式推断
template<typename T>
B(T, T) -> B<double>;void Test2() {B(1, 1); //显示调用自定义推断,推断为B<double>
}

此时生成的就是 d o u b l e double double类的 B B B类啦

3.无构造函数实例化

前面两种实例化模板的方式都是通过构造函数来实例化模板。
C + + C++ C++中,我们还可以通过初始化列表+推断指南的方式来实例化模板
具体代码如下:

template<typename T>
struct MyType {T val1, val2;//不存在构造函数
};//显式推断
template<typename T> 
MyType(T,T) -> MyType<T>;//使用初始化列表
void Test3() {//使用初始化列表相当于使用了构造函数MyType t1{ 1,1 };MyType<double>t2{2, 3};
}

我们通过 d u m p b i n dumpbin dumpbin来验证一下

在这里插入图片描述在这里插入图片描述

确实实例化出了这个类型。

当然,使用这种方法有局限性,需要满足以下条件:

在这里插入图片描述在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [激光原理与应用-126]:傅里叶变化与频域分析
  • Redis的内存淘汰策略-volatile-ttl
  • 【Python机器学习】词向量推理——语义查询与类比
  • HarmonyOS实战开发:NAPI接口规范开发
  • 华为 HCIP-Datacom H12-821 题库 (3)
  • vscode Git代码版本回退
  • 【生日视频制作】宝马提车交车仪式感广告展示牌AE模板修改文字软件生成器教程特效素材【AE模板】
  • javacv-ffmpeg ProcessBuilder批量旋转图片
  • Elasticsearch Suggesters API详解与联想词自动补全应用
  • Oracle rac模式下undo表空间爆满的解决
  • 公钥密码选择题
  • Cesium 台湾省白膜数据渲染
  • Java语言程序设计基础篇_编程练习题**17.17(BitOutputStream)
  • IBM退出中国,LabVIEW未来走向何方?
  • PostgreSQL技术内幕6:PostgreSQL索引技术
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS 提示工具(Tooltip)
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • eclipse(luna)创建web工程
  • Flex布局到底解决了什么问题
  • Fundebug计费标准解释:事件数是如何定义的?
  • github指令
  • Java编程基础24——递归练习
  • JAVA并发编程--1.基础概念
  • KMP算法及优化
  • mysql 数据库四种事务隔离级别
  • python学习笔记 - ThreadLocal
  • SSH 免密登录
  • tab.js分享及浏览器兼容性问题汇总
  • Webpack 4x 之路 ( 四 )
  • 工程优化暨babel升级小记
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 源码安装memcached和php memcache扩展
  • 云大使推广中的常见热门问题
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​2021半年盘点,不想你错过的重磅新书
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C++)八皇后问题
  • (CPU/GPU)粒子继承贴图颜色发射
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二) 初入MySQL 【数据库管理】
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (南京观海微电子)——示波器使用介绍
  • (五)c52学习之旅-静态数码管
  • (转)memcache、redis缓存