C++模板元编程

C++模板元编程

为什么需要模板函数?

  • 避免重复写代码

模板函数定义

  • 使用template <class T> 或者template <typename T>
  • 其中T是可以变成任何类型
  • 调用时候T会替换成需要的类型 twice<int>会将T替换成int
template <class T>
T twice(T t)
{return T * 2;
}int main()
{std::cout << twice<int>(2) << std::endl;
}

除此之外,C++规定,当模板类型参数T作为函数参数时,可以省略该模板参数。自动根据调用者的参数去判断类型

模板参数默认类型

如果模板参数返回了T类型,且没有出现再参数中,那么编译器无法推断T的类型,这个时候我们不得不指定类型。但是,我们也可以通过template <class T = int>这种方式表示T的默认类型是int

template <class T = int>  
T two()
{return  2;
}int main()
{std::cout << two(2) << std::endl;
}
  • 除了上面的以class T 作为参数类型以外,我们还可以用template <int N>来声明一个整数N作为模板参数

  • 不过模板参数只支持整数类型(包括enum),浮点类型、指针类型不能声明为模板参数,自定义类型也不可以

模板参数:多个模板参数

int Nclass T 可以一起使用,你只需要指定其中一部分参数即可,会自动根据参数类型(T msg)、默认值(int N = 1),推断尖括号里没有指定的那些参数

template <int N = 1, class T>  
void two(T msg)
{for (int i = 0; i < N; i++){std::cout << msg << std::endl;}
}int main()
{two("one");
}

模板的惰性:延迟编译

要证明模板的惰性,只要下面的例子

template <class T = void>  
T two()
{"aaa" = "aaa";
}int main()
{std::cout << "aa" << std::endl;
}

只要是编译器编译了two 函数,则一定会报错,但是实际编译的时候是可以编译的,这是因为模板没有被调用,如果模板被调用了,才会编译报错。

总结

  • 类型作为参数:template <class T>

  • 整形作为参数:template <int N>

  • 定义默认参数:template <int N = 0, class T = int>

  • 使用模板函数:myfunc<T, N>()

  • 模板函数可以自动推导类型,从而参与重载

  • 模板具有惰性,多次编译的特点

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

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

相关文章

vue3+ts+element-plus 标签红色波浪形(属性不全)

新建文件shims-element-plus.d.ts,具体配置如下 import {ElAutocomplete,ElBadge,ElBreadcrumb,ElBreadcrumbItem,ElButton,ElCard,ElCheckbox,ElCheckboxGroup,ElCol,ElCollapse,ElCollapseItem,ElColorPicker,ElConfigProvider,ElContainer,ElDatePicker,ElDialog,ElDivide…

谷粒商城实战(031 业务-秒杀功能2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第315p-第p318的内容 秒杀上架 定时上架功能 EnableAsync 异步 EnableScheduling 定时调度 Configuration 配置类 创建上架定时任务类和方法 …

408数据结构-图的存储与基本操作 自学知识点整理

前置知识&#xff1a;图的基本概念 图的存储必须完整、准确地反映顶点集和边集的信息。根据不同图的结构和算法&#xff0c;采用不同的存储方式将对程序的效率产生相当大的影响&#xff0c;因此选取的存储结构应适合于待求解的问题。 图的存储 邻接矩阵法 所谓邻接矩阵存储&a…

每天一个数据分析题(三百四十三)

同环比是帮助阅读者了解维度项表现水平有没有随着时间的推移而得以增长提升&#xff0c;以下对于同环比的说法正确的是&#xff1f; A. 同环比计算方法一般适用于对长周期业务行为结果的观测 B. 若产品具备季节属性特征&#xff0c;则应优先使用同比计算方法 C. 上期值一般指…

利用OBS+VLC+ASS插件实现多路rtsp慢直播流轮播播放

利用OBS+VLC+ASS插件实现多路rtsp慢直播流轮播播放 解决方案速览软件安装第一次使用OBS界面(不是第一次使用可以跳过该步骤)添加VLC视频源利用OBS多个**场景**特性实现布置多个VLC-rtsp视频流场景轮播解决方案速览 利用OBS进行本地直播画面的构建。添加VLC视频源:安装完VLC后…

c++框架介绍

C源文件后缀名.cc/.cpp&#xff0c;头文件后缀名.hh/.hpp C&#xff1a;编译使用g命令 3.C输入输出流比c中的printf更加简化 4.日志系统&#xff1a;拿到一个新的程序&#xff0c;怎么读取借助于日志系统&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&…

了解m4s格式

正常在hls V7 和 DASH中都会使用m4s存放数据。他们使用fmp4的方式来存放信息&#xff1a; fmp4格式 &#xff1a; 一、hls V7介绍 1. 包含的文件&#xff1a; 2. prog_index.m3u8中 指明了 init.mp4与 上面各个.m4s文件的关系&#xff0c;具体内容为&#xff1a; 其中init.mp…

USB - 进入Suspend状态和Cable长短的关系

USB 电缆的长度会对电流产生影响&#xff0c;但这主要是由于电缆的电阻造成的。下面是其工作原理&#xff1a; 1. 电缆电阻&#xff1a; USB 电缆越长&#xff0c;电阻越大。这种电阻会导致电缆上的电压下降&#xff0c;从而影响设备端的可用电压水平。 2. 电压下降&#xff1a…

[数据集][图像分类]轮胎纹理识别裂纹和正常轮胎分类数据集1028张2类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1028 分类类别数&#xff1a;2 类别名称:["cracked","norma…

容器技术基础理论与常用命令:必知必会,效率翻倍!

如何利用容器技术提升你的工作效率&#xff1f;掌握基础理论和常用命令是必不可少的&#xff0c;本文将为你全面介绍容器技术&#xff0c;并教你必知必会的技能&#xff0c;让你工作、学习效率翻倍&#xff0c;对于网络安全工作者也是必不可少的技能&#xff01; 0. 引言 学习…

【Mac版】Java生成二维码

软件版本 IntelliJ IDEA&#xff1a;2023.2 JDK&#xff1a;17 Tomcat&#xff1a;10.1.11 Maven&#xff1a;3.9.3 技术栈 servlet谷歌的&#xff1a;zxing 生成普通的黑白二维码在二维码中间添加一个小图标 github开源项目&#xff1a;qrcode qrcode开源项目的内部是基于z…

一些关于深度聚类以及部分对比学习的论文阅读笔记

目录 资料SwAV问题方法方法的创新点为什么有效有什么可以借鉴的地方聚类Multi-crop 代码 PCL代码 Feature Alignment and Uniformity for Test Time Adaptation代码 SimSiam 资料 深度聚类算法研究综述(很赞&#xff0c;从聚类方法和深度学习方法两个方面进行了总结&#xff0…

OpenEuler22.03 LTS自动安装单机版OpenGauss 5.0.2脚本

1,将脚本和opengauss软件包放到同一个目录下(不要放到/root下面,建议放到/opt/soft下面目录权限要有755),不需要进行解压缩,安装包下载地址如下: 软件包 | openGauss 2.规划好gs的数据目录,提前创建好目录,例如放到/data/guassdb/data下面,你只需要提前创建好/data就行了 3.…

STL中stack的使用

目录 一、stack类介绍和使用 stack类介绍 stack类定义 stack类常见构造函数 stack数据操作 empty()函数 top() pop() 和 push() 函数 size()函数 swap()函数 一、stack类介绍和使用 stack类介绍 1.stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下…

Flutter 中的 IconTheme 小部件:全面指南

Flutter 中的 IconTheme 小部件&#xff1a;全面指南 Flutter 是一个功能丰富的 UI 开发框架&#xff0c;它允许开发者使用 Dart 语言来构建跨平台的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;IconTheme 是一个用于设置应用中图标主题的小部件&#xff0c;…

Eclipse语言编程:深入探索与实战应用

Eclipse语言编程&#xff1a;深入探索与实战应用 在编程的世界里&#xff0c;Eclipse以其强大的功能和灵活的扩展性&#xff0c;赢得了广大开发者的青睐。而Eclipse语言编程&#xff0c;更是将这一平台的优势发挥得淋漓尽致。本文将从四个方面、五个方面、六个方面和七个方面&…

「动态规划」买卖股票的最佳时机含冷冻期

力扣原题链接&#xff0c;点击跳转。 给你一个整数数组prices&#xff0c;其中prices[i]表示第i天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;&#xff1a;卖出股票后&a…

Python 关于字符串格式化

在Python中&#xff0c;字符串格式化有以下几种方法&#xff1a; 1.可以使用字符串的str.center(width), str.ljust(width), 和 str.rjust(width)方法来实现字符串的居中、左对齐和右对齐操作。 居中对齐&#xff1a; text "Python" centered_text text.center(10…

华为S5700交换机版本升级步骤

在用一台华为交换机。由于需要做目的镜像接口&#xff0c;在配置过程中超过一个双向流量观察口就会报错。从官方文档查到可以升级版本解决。记录一下升级过程。 首先确定设备型号S5700-28C-EI&#xff0c;版本&#xff1a; s5700ei-v100r005c01spc100。一定仔细阅读官方文档。明…

[python][whl]python模块python_geohash的whl文件所有版本下载地址汇总

Python使用Geohash实现 作为一名经验丰富的开发者&#xff0c;你将要教授一位刚入行的小白如何使用Python实现Geohash。Geohash是一种地理编码系统&#xff0c;将地球分成若干个矩形区域&#xff0c;并为每个矩形区域分配一个唯一的字符串编码。下面是实现这一任务的详细步骤&a…