[C++提高编程](一):模板----函数模板

目录

函数模板作用

函数模板的语法

注意事项

普通函数与函数模板的区别

普通函数与函数模板的调用规则

模板的局限性

案例--通用数组选择排序从大到小


模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。

函数模板作用

建立一个通用函数,其函数返回值类型和形参类型可不具体制定,用一个虚拟类型来代表.

函数模板的语法

        template<typename T>

        函数声明或定义

注意事项

  • 自动类型推导,必须推导出一致的数据类型 T,才可以使用
  • 模板必须要确定出 T 的数据类型,才可以使用
#include <iostream>
using namespace std;template<typename T>//typename可以替换成class
void swapType(T& a, T& b)
{T temp = a;a = b;b = temp;
}template<typename T> //未确认T数据类型,无法使用自动类型推导调用
void func()
{cout << "func 调用" << endl;
}static void test01()
{int a = 10, b = 20;cout << "交换前:a,b=" << a << "," << b << endl;swapType<int>(a, b);  //显示指定类型cout << "交换后:a,b=" << a << "," << b << endl;double x = 11.1, m = 22.2;cout << "交换前:x,m=" << x << "," << m << endl;swapType(x, m);       //自动类型推导cout << "交换后:x,m=" << x << "," << m << endl;}int main()
{test01();system("pause");return 0;
}

普通函数与函数模板的区别

  • 普通函数可以发送隐式类型转换
  • 函数模板 用自动类型推导,不可以发生隐式类型转换
  • 函数模板 用显示指定类型,可以发生隐式类型转换

普通函数与函数模板的调用规则

  • 如果函数模板和普通函数都可以实现,优先调用普通函数
  • 可以通过模板参数列表来强制调用函数模板
  • 函数模板可以发生函数重载
  • 如果函数模板可以产生更好的匹配,那么优先调用函数模板

        注意:使用函数模板后就不要再使用普通函数,容易产生二义性

#include <iostream>
using namespace std;void myPrint(int a, int b)
{cout << "调用普通函数" << endl;
}template<class T> 
void myPrint(T a, T b)
{cout << "调用函数模板myPrint(T a, T b)" << endl;
}template<class T>
void myPrint(T a, T b, T c) //函数重载
{cout << "调用函数模板myPrint(T a, T b, T c)" << endl;
}void test()
{int a = 4, b = 1;myPrint(a, b);   //优先调用普通函数myPrint<>(a, b); //空模板列表强制调用函数模板myPrint(a, b, 3); //空模板列表强制调用函数模板myPrint('a', 'b'); //更好的匹配调用函数模板
}int main()
{test();system("pause");return 0;
}

模板的局限性

        模板虽然通用但不是万能的

        利用重载,针对特定化类型提供具体化的模板

#include <iostream>
using namespace std;class Person
{
public:string m_name;int m_age;Person(string name, int age){this->m_name = name;this->m_age = age;}
};template<class T> 
bool myCompare(T &a, T &b)
{if (a == b){cout << "相等" << endl;return true;}else{cout << "不相等" << endl;return false;}
}//利用重载,针对特定化类型提供具体化的模板
template<> bool myCompare(Person& p1, Person& p2) 
{if (p1.m_name == p2.m_name && p1.m_age == p2.m_age){cout << "相等" << endl;return true;}else{cout << "不相等" << endl;return false;}
}static void test()
{bool result = 0;int a = 4, b = 1;result = myCompare(a, b);  Person p1("Tom", 10);Person p2("Tom", 10);result = myCompare(p1, p2); 
}int main()
{test();system("pause");return 0;
}

案例--通用类型数组-选择排序-从大到小

#include <iostream>
using namespace std;template<class T>
void mySwap(T& a, T& b)
{T temp = a;a = b;b = temp;
}template<class T>
void printArray(T arr[], int len)
{for (int i = 0; i < len; i++){cout << arr[i];}cout << endl;
}template<class T> 
void mySort(T arr[], int len)
{for (int i = 0; i < len; i++){int max = i; //认为最大值的下标for (int j = i+1; j < len; j++){if (arr[max] < arr[j]){max = j;}}if (max != i){mySwap(arr[max], arr[i]);}}
}static void test01char()
{char charArr[] = "febadc";int num = sizeof(charArr) / sizeof(char);mySort(charArr, num);printArray(charArr, num);}static void test02int()
{int charArr[] = {3,1,9,4,5,7,8};int num = sizeof(charArr) / sizeof(int);mySort(charArr, num);printArray(charArr, num);}int main()
{test01char();test02int();system("pause");return 0;
}

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

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

相关文章

LSS (Lift, Splat, Shoot)

项目主页 https://nv-tlabs.github.io/lift-splat-shoot 图1&#xff1a;本文提出一种模型&#xff0c;给定多视角相机数据 (左)&#xff0c; 直接在鸟瞰图 (BEV) 坐标系(右)中推理语义。我们展示了车辆分割 (蓝色)&#xff0c;可驾驶区域 (橙色) 和车道分割 (绿色) 的结果。然…

【编程向导】JavaScript-基础语法-语句和声明一期讲解

文章目录 while 语句语法参数 示例代码示例 try-catch 语句catchfinally嵌套捕获异常标识符 throw 语句语法参数 示例代码示例抛出一个对象 while 语句 while 语句可以在某个条件表达式为真的前提下&#xff0c;循环执行指定的一段代码&#xff0c;直到那个表达式不为 true 时…

C语言项目:数组与函数实践:扫雷游戏

目录 目录&#xff1a; 1.扫雷游戏分析与设计 1.1扫雷游戏的功能说明&#xff1a; 1.1.1使用控制台实现经典扫雷的游戏 1.1.2游戏可以通过菜单实现继续玩或者退出游戏 1.1.3扫雷棋盘是9*9的格子 1.1.4默认随机布置10个雷 1.1.5 可以排查雷 2.扫雷游戏的代码实现 1.遇到的问题…

项目文章|真菌ChIP-seq+RNA-seq解析脱落酸生物合成的调控机制

组蛋白翻译后修饰是表观遗传调控的主要机制之一&#xff0c;已被证明在基因表达的调控中发挥重要作用&#xff0c;参与真菌发育、感染相关的形态发生、环境应激反应、次级代谢产物的生物合成和致病性。我们分享过不少真菌组蛋白修饰的文章&#xff0c;今天接着带来一篇利用ChIP…

Anaconda安装proplot库

看了一下Anaconda中的环境&#xff0c;现在我有4个&#xff0c;其中gee是一个虚拟环境 因此一般在prompt中装库时要先进入其中一个虚拟环境 conda activate geepip install proplot --no-deps下完了之后&#xff0c;发现版本不对应 conda install matplotlib3.4.3

软件开发项目管理/研发项目管理软件:国产EDA工具厂商行芯科技上线奥博思PowerProject项目管理软件平台

国内领先的EDA工具链提供商杭州行芯科技有限公司&#xff08;以下简称&#xff1a;行芯科技&#xff09;与北京奥博思软件技术有限公司达成战略合作&#xff0c;奥博思软件将基于PowerProject项目管理系统助力行芯科技实现研发项目的全生命周期管理&#xff0c;提升管理效能&am…

vue系列:使用vue3、ant-d,a-select下拉的搜索功能

背景 记录一下 大屏项目中&#xff0c;下拉数据过多&#xff0c;想使用下拉搜索功能&#xff1b; 输入汉字&#xff0c;匹配对应的项目&#xff1b; 解决方案 关键代码如下&#xff1a; a-select控件 <a-selectv-model:value"state.schemeInfo.monitorList"sho…

论文阅读:Face Deblurring using Dual Camera Fusion on Mobile Phones

今天介绍一篇发表在 ACM SIGGRAPH 上的文章&#xff0c;是用手机的双摄系统来做人脸去模糊的工作。这也是谷歌计算摄影研究组的工作。 快速运动物体的运动模糊在摄影中是一个一直以来的难题&#xff0c;在手机摄影中也是非常常见的问题&#xff0c;尤其在光照不足&#xff0c;…

短链码生成方案探讨思维链路

前段时间在做短链平台项目时&#xff0c;对短链码的生成进行了研究&#xff0c;我将思维活动和方案探讨过程进行了记录&#xff0c;文章没什么干货&#xff0c;都是思维过程。 短链码生成方式&#xff0c;应具备以下几个特点&#xff1a;生成性能强劲、碰撞概率低&#xff08;避…

jasypt加解密

项目中经常遇到jasypt加解密的配置文件&#xff0c;尤其是项目不是自己创建的时候&#xff0c;压根不知道加密的内容是什么&#xff0c;而配置文件中一般加密的也都是数据库或其他非结构型数据库的账号或密码&#xff0c;这时候想要看一下db的内容就非常的头疼&#xff0c;除了…

OSDI 2023

17th USENIX Symposium on Operating Systems Design and Implementation, OSDI 2023, Boston, MA, USA, July 10-12, 2023. 第17届USENIX操作系统设计与实现研讨会&#xff0c;OSDI 2023&#xff0c;2023年7月10-12日&#xff0c;美国马萨诸塞州波士顿。 1. Ship your Criti…

【爬虫】– 抓取原创力文档数据

使用RPA工具&#xff0c;实现针对于原创力中不可下载文档的抓取&#xff0c;可延用于其他类似文库 1 使用工具、环境 影刀RPA、WPS Office、谷歌浏览器&#xff08;非指定&#xff09; 2 代码流程 3 关键点 此方案只适合抓取非VIP即可预览全文的文档&#xff0c;抓取下来的数…

B007-springcloud alibaba 消息驱动 Rocketmq

目录 MQ简介什么是MQMQ的应用场景异步解耦流量削峰 常见的MQ产品 RocketMQ入门RocketMQ环境搭建环境准备安装RocketMQ启动RocketMQ测试RocketMQ关闭RocketMQ RocketMQ的架构及概念RocketMQ控制台安装 消息发送和接收演示发送消息接收消息 案例订单微服务发送消息用户微服务订阅…

(done) 解释 python3 torch.utils.data DataLoader

特别注意&#xff1a;DataLoader 返回的迭代器是无尽的&#xff0c;依据如下 (CHATGPT3.5) DataLoader 返回的迭代器默认情况下是无尽的&#xff0c;因为它会无限地循环遍历数据集&#xff0c;以提供批量的数据。在训练神经网络时&#xff0c;通常会使用无尽的迭代器来循环遍历…

LEETCODE 100255. 成为 K 特殊字符串需要删除的最少字符数

整体思路: 1.可以看到这道题是要求是最小的&#xff0c;那么可以想到遍历所有情况 2.把题干已知条件转换为一个数组&#xff0c;那么只需要以数组每个元素为开头遍历所有情况即可。 3.对于一个数考虑其后面的情况&#xff0c;其后每个数等于这个数k和数本身的最小值(遍历累计求…

spring boot 运行mongodb sql

因项目数据放到了Mongodb 中&#xff0c;需在Mongodb 中查询数据&#xff0c;网上找了好久总算找到了实现方式 借用本地命令号读取命令行数据 主要是分2步&#xff1a; 1、下载 sql-to-mongo-db-query-converter 这个是一个3放插件 作用是将sql语句转成 Mongodb shell 语句…

2024数据结构面试常见问题

大家好&#xff01;今天我要和大家分享的是2024年数据结构面试常见问题。无论你是编程新手&#xff0c;还是有一定基础的开发者&#xff0c;掌握这些数据结构面试问题&#xff0c;都将助你在面试中脱颖而出&#xff0c;赢得心仪的offer。 下面&#xff0c;我们就一起来学习这些…

参数高效微调(PEFT)技术概览

参数高效微调&#xff08;PEFT&#xff09;技术概览 在大型语言模型&#xff08;LLMs&#xff09;的世界里&#xff0c;参数量庞大&#xff0c;通常在70亿至700亿之间。这些模型的自监着训练成本高昂&#xff0c;对公司可能意味着高达1亿美元的支出。而对于资源相对有限的研究…

rlwrap安装

引言 我们在使用sqlplus对oracle数据库进行操作的时候&#xff0c;难免会出现这样一种情况&#xff1a;写完一长串命令后发现中间有书写错误的地方&#xff0c;这个时候如果我们想移动光标去修正错误的地方&#xff0c;会出现类似如下的现象&#xff1a; SQL> select name…

python的封装应用

封装在Python中有许多应用场景&#xff0c;其中一些主要的应用包括&#xff1a; 隐藏实现细节&#xff1a; 通过将数据和实现细节封装在类内部&#xff0c;可以隐藏对象的内部状态和实现细节&#xff0c;从而提高代码的安全性和可维护性。 class BankAccount: def __init…