C++ —— 模板类与函数
C++ —— 模板类与函数
模板类可以用于函数的参数和返回值,有三种形式:
- 普通函数,参数和返回值是模板类的实例化版本。
- 函数模板,参数和返回值是某种的模板类。
- 函数模板,参数和返回值是任意类型(支持普通类和模板类和其它类型)。
示例代码如下:
#include <iostream>
using namespace std;template <class T1, class T2>
class AA {
public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y): m_x(x), m_y(y) {}void show() {cout << "show() m_x = " << m_x << ", m_y = " << m_y << endl;}
};AA<int, string> func(AA<int, string>& aa) {aa.show();cout << "调用 func(AA<int, string>& aa)" << endl;return aa;
}int main() {AA<int, string> aa(10, "hello");func(aa);return 0;
}
运行结果如下:
show() m_x = 10, m_y = hello
调用 func(AA<int, string>& aa)
注意事项:
- 不要把AA<int, string>当成模板类,AA<int, string>是一个
具体类的类型。 - 类的名字是AA<int, string>,可以传值,也可以传引用。一般
传引用。 - func()这个函数,只能处理模板类AA
多种数据类型中的一种。
如果想让func()函数支持模板类AA,必须把func()函数变成函数模板。修改后的代码如下:
#include <iostream>
using namespace std;template <class T1, class T2>
class AA {
public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y): m_x(x), m_y(y) {}void show() {cout << "show() m_x = " << m_x << ", m_y = " << m_y << endl;}
};AA<int, string> func(AA<int, string>& aa) {aa.show();cout << "调用普通函数版本 func(AA<int, string>& aa)" << endl;return aa;
}// 模板类AA有2个通用类型参数,模板函数也用2个通用类型参数。
// 再把函数中具体的数据类型用T1和T2替换即可
template <typename T1, typename T2>
AA<T1, T2> func(AA<T1, T2>& aa) {aa.show();cout << "调用模板函数版本 func(AA<T1, T2>& aa)" << endl;return aa;
}int main() {AA<int, string> aa(123, "你好!");func(aa);// AA<string, string> aa("qwer", "hello");// func(aa);return 0;
}
当普通版本跟模板函数版本都可与实参匹配上时,将优先使用普通函数,运行结果如下:
show() m_x = 123, m_y = 你好!
调用普通函数版本 func(AA<int, string>& aa)
main()函数改成这样,则使用模板函数版本,代码如下:
int main() {// AA<int, string> aa(123, "你好!");// func(aa);AA<string, string> aa("qwer", "hello");func(aa);return 0;
}
运行结果如下:
show() m_x = qwer, m_y = hello
调用模板函数版本 func(AA<T1, T2>& aa)
在函数中,如果要发挥模板类通用性的特点,必须结合模板函数。再修改一下代码:
#include <iostream>
using namespace std;template <class T1, class T2>
class AA {
public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y): m_x(x), m_y(y) {}void show() {cout << "show() m_x = " << m_x << ", m_y = " << m_y << endl;}
};template <typename T>
T func(T& aa) {aa.show();cout << "调用模板函数版本 func(T& aa)" << endl;return aa;
}int main() {AA<string, string> aa("qwer", "hello");func(aa);return 0;
}
运行结果如下:
show() m_x = qwer, m_y = hello
调用模板函数版本 func(T& aa)
T func(T& aa) 这种才是正规的写法,因为这种方法支持任意模板类型,普通类也支持。在函数中用到了对象的show()方法,那么只要对象有show()方法,它都支持。而AA<T1, T2> func(AA<T1, T2>& aa)这个版本只支持AA这一种模板类。
示例代码1:
#include <iostream>
using namespace std;template <class T1, class T2>
class AA {
public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y): m_x(x), m_y(y) {}void show() {cout << "show() m_x = " << m_x << ", m_y = " << m_y << endl;}
};class BB {
public:void show() {cout << "调用BB::show()函数" << endl;}
};template <typename T1, typename T2>
AA<T1, T2> func(AA<T1, T2>& aa) {aa.show();cout << "调用模板函数版本 func(AA<T1, T2>& aa)" << endl;return aa;
}template <typename T>
T func(T& aa) {aa.show();cout << "调用模板函数版本 func(T& aa)" << endl;return aa;
}int main() {BB bb;func(bb); return 0;
}
运行结果如下:
调用BB::show()函数
调用模板函数版本 func(T& aa)
示例代码2:
#include <iostream>
using namespace std;void show() {cout << "调用普通函数 show()" << endl;
}class CC {
public:void operator() () {cout << "调用CC类的仿函数" << endl;}
};template <typename T>
void func(T t) {t(); // 调用函数
}int main() {CC cc;func(cc); // 在func()函数中,将调用CC类的仿函数return 0;
}
运行结果如下:
调用CC类的仿函数
如果func()函数的实参不传bb,用show()函数的函数名,也就是函数指针,代码如下:
int main() {func(show); // 在func()函数中,将调用普通函数 show()return 0;
}
运行结果如下:
调用普通函数 show()
func()是函数模板,支持任意类型,不管传进去的是什么,只要适应函数中的代码即可。把cc传给func()函数的时候,实参的数据类型是类;传函数名show进去的时候,实参是函数指针。
感谢浏览,一起学习!
相关文章:
C++ —— 模板类与函数
C —— 模板类与函数 模板类可以用于函数的参数和返回值,有三种形式: 普通函数,参数和返回值是模板类的实例化版本。函数模板,参数和返回值是某种的模板类。函数模板,参数和返回值是任意类型(支持普通类和…...
【软考高级】系统架构设计师复习笔记-精华版
文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包(BSP…...
免费 IP 归属地接口
免费GEOIP,查询IP信息,支持IPV4 IPV6 ,包含国家地理位置,维度,asm,邮编 等,例如 例如查询1.1.1.1 http://geoip.91hu.top/?ip1.1.1.1 返回json 对象...
AIA - IMSIC之二(附IMSIC处理流程图)
本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…...
数据处理之数据规约
数据处理之数据规约 1. 数据规约概述 数据规约是数据处理中的重要方法,旨在让数据处理更简便、高效,以满足业务需求。当从数据仓库获取的数据量庞大时,直接在海量数据上进行分析和挖掘成本颇高。数据规约可得到数据集的归约表示,…...
爬虫代理服务要怎么挑选?
在数据采集的世界里,爬虫代理服务不仅帮助我们高效地收集信息,还能在保护数据安全方面发挥重要作用。但面对市场上琳琅满目的代理服务,我们该如何挑选呢?本文将为你提供一些实用的建议,帮助你找到最适合你的爬虫代理服…...
vue3组件调用解决奇怪问题的详细记录
左边是父组件,右边是子组件,运行正常: 父组件中的子组件加上class属性,运行报错:Extraneous non-props attributes (class) were passed to component but could not be automatically inherited because component re…...
【物联网技术与应用】实验16:模拟霍尔传感器实验
实验16 模拟霍尔传感器实验 【实验介绍】 基于霍尔效应,霍尔传感器是响应于磁场而改变其输出电压的传感器。霍尔传感器用于接近开关,定位,速度检测和电流检测应用。 霍尔传感器可以分为模拟霍尔传感器和开关霍尔传感器由电压调节器&#x…...
【机器学习案列】车牌自动识别系统:基于YOLO11的高效实现
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
高精度问题
目录 算法实现基础 高精度加法AB 测试链接 源代码 代码重点 高精度减法A-B 测试链接 源代码 代码重点 高精度乘法A*b和A*B 测试链接 源代码 代码重点 高精度除法A/b和A/B 测试链接 源代码 代码重点 高精度求和差积商余 算法实现基础 本算法调用STL…...
kong网关使用pre-function插件,改写接口的返回数据
一、背景 kong作为api网关,除了反向代理后端服务外,还可对接口进行预处理。 比如本文提及的一个小功能,根据http header某个字段的值,等于多少的时候,返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…...
【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口
前言 前几年WPS还可以免费处理5页以内的PDF转excel,现在必须付费了,而且百度其他在线的PDF转excel都是要收费的,刚好前几年调研过百度OCR的高精度含位置接口,依然是每天可以免费调用50次,本篇是基于此接口,…...
vue2 elementui if导致的rules判断失效
优化目标 和 目标转化出价必填的 切换的时候还会隐藏掉 这时候的if语句会导致rules判断失效 我的办法是把判断拉到外面 别放在el-form-item里 <section v-if"unitForm.baseTarget OCPM && unitForm.cpaTargetOptions ! undefined && unitForm.cpaTa…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2) 背景 架构图 正片开始之前,请一定先熟悉上面的架构图,跟着我的步骤,一步一步执行成功,相信后续根据自己特定的需求定制CI/CD。 需求 …...
嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备
目录 一、概述 二、一张图说尽HA 三、HA的相关资料 四、米家集成划重点 五、总结 一、概述 小米Home Assistant 米家集成开源一周star近15k,迭代4个版本,12个贡献者 本文科普一下Home Assistant(简称HA)、米家集成ÿ…...
spring cloud gateway 3
**Spring Cloud Gateway 3** 是 Spring Cloud 生态系统中的一个重要组件,用于构建 API 网关,提供路由、监控、安全等关键功能。以下是关于 Spring Cloud Gateway 3 的详细介绍: ## 1. 什么是 Spring Cloud Gateway? **Spring Clou…...
html + css 淘宝网实战
之前有小伙伴说,淘宝那么牛逼你会写代码,能帮我做一个一样的淘宝网站吗,好呀,看我接下来如何给你做一个淘宝首页。hahh,开个玩笑。。。学习而已。 在进行html css编写之前 先了解下网页的组成和网页元素的尺寸吧 1.网页的组成 …...
游戏引擎学习第62天
回顾 我们目前正在开发一把虚拟剑,目的是让角色可以用这把剑进行攻击。最初的工作中,我们使用了一个摇滚位图作为虚拟剑的模型,并且实现了一个基本的功能:角色可以丢下剑。但这个功能并没有达到预期的效果,因为我们想…...
LeetCode - Google 校招100题 第6天 回溯法(Backtracking) (8题)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144743505 LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21题)校招100题 第3天 动态规划(DP) (20题)...
C项目 天天酷跑(下篇)
上篇再博客里面有,接下来我们实现我们剩下要实现的功能 文章目录 碰撞检测 血条的实现 积分计数器 前言 我们现在要继续优化我们的程序才可以使这个程序更加的全面 碰撞的检测 定义全局变量 实现全局变量 void checkHit() {for (int i 0; i < OBSTACLE_C…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
