【泛型编程】函数模板

简介: 【泛型编程】函数模板

函数模板是指函数逻辑结构相同,但是参数类型不同的一类函数的抽象,即类型参数化。引用官方描述如下:

模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属。

模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。

下面写一个函数模板的实例,通过实例分析函数模板的语法和使用规则

1. #include <iostream>
2. using namespace std;
3. 
4. template<typename T>
5. void my_print(T a, T b)
6. {
7.  cout << "模板函数 " << a << " " << b << endl;
8. }
9. 
10. void my_print(int a, int b)
11. {
12.   cout << "普通函数 (int a, int b) " << a << " " << b << endl;
13. }
14. 
15. void my_print(int a, char b)
16. {
17.   cout << "普通函数 (int a, char b) " << a << " " << b << endl;
18. }
19. 
20. int main()
21. {
22.   my_print(1, 2); //优先匹配普通函数
23. 
24.   my_print('a', 4); //调用 my_print(int a, int b) 并会自动进行类型转换,把 'a' 转换为 int 型
25. 
26.   my_print('a', 'b'); //调用模板函数,模板函数严格进行参数类型匹配,并会自动推导参数类型
27.   //只有调用时两个参数类型完全一致且没有普通函数匹配的时候才会调用模板函数(参数更佳匹配)
28. 
29.   my_print<char>('a', 'b'); //显式参数类型
30. 
31.   my_print<>(1, 2); //强制使用模板函数,不会在调用 my_print(int a, int b)
32. 
33.   //my_print<>(1, 'a'); //错误  C2672 “my_print” : 未找到匹配的重载函数 
34.   //函数模板不会进行参数类型转换
35. 
36. 
37.   system("pause");
38.   return 0;
39. }

编译并执行上面的程序可以看到打印的结果和我们在程序中分析的规则一致

             

另外,如果把上面注释掉的语句放开

my_print<>(1, 'a');

也就是强制使用模板函数,并传入两个类型不同的参数,再次编译可以看到编译器报错

这证明了我们所分析的,模板函数不会进行参数自动类型转换。

最后函数模板的实现并不是提前把所有可能的参数类型都列举出来并生成相应的函数,而是二次编译理论。函数模板的实现机制实际是两次编译,第一次编译是在模板函数声明的地方进行编译;第二次编译是在模板函数调用的地方,对参数替换后的函数进行编译。


相关文章
|
机器学习/深度学习 人工智能 监控
利用人工智能审查代码:提升代码质量和安全性
【10月更文挑战第15天】本文探讨了AI在代码审查中的应用,介绍了AI辅助代码审查工具如何通过机器学习算法提升代码质量、检测潜在错误,并促进团队知识共享。文中还详细说明了实施AI辅助代码审查的步骤及其实战技巧,强调了结合人工审查、定制化模型和持续监控的重要性。
|
11月前
|
Ubuntu 网络安全 数据安全/隐私保护
访问仓库
访问仓库
386 0
Python实现PowerPoint演示文稿到图片的批量转换
PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具,被广泛应用于教育、商务汇报及个人项目展示等领域。然而,面对不同的分享场景与接收者需求,有时需要我们将PPT内容以图片形式保存与传播。 这样能够避免软件兼容性的限制,确保信息接收者无需安装特定软件即可查看内容,还便于在网络社交平台、博客、电子邮件中快速分享与嵌入。而用Python代码可以高效地实现PowerPoint演示文稿到图片的批量转换,从而提升工作效率。
|
存储 缓存 资源调度
Vue3状态管理新选择:Pinia安装与使用详解,以及与Vuex的对比分析
Vue3状态管理新选择:Pinia安装与使用详解,以及与Vuex的对比分析
645 0
|
SQL 存储 监控
obdiag:一款OceanBase 数据库诊断的利器
本次分享的主题是obdiag:一款 OceanBase 数据库诊断的利器,由蚂蚁集团 OceanBase 技术专家汤庆分享。主要分为四个部分: 1. OceanBase 概述 2. Obdiag 项目价值 3. Obdiag 设计与实现 4. Obdiag 未来规划
435 14
|
缓存 安全 应用服务中间件
Nginx的反向代理功能有哪些应用场景呢
【8月更文挑战第22天】Nginx的反向代理功能有哪些应用场景呢
931 0
|
机器学习/深度学习 人工智能 自然语言处理
【活动】人工智能:前沿科技中的创业机遇与挑战
本文探讨了人工智能领域的创业机遇与挑战。AI技术的快速发展,如深度学习、自然语言处理等,已广泛应用于医疗、金融、制造等行业。未来创业机会包括AI基础设施、垂直行业解决方案、伦理安全领域及AI与其他技术的融合创新。然而,创业者需面对技术壁垒、数据获取、市场接受度、商业模式创新及政策伦理挑战。要在AI领域成功创业,需紧跟技术趋势,深挖行业需求,创新商业模式,并妥善应对各种挑战。
1207 6
|
存储 Ubuntu 关系型数据库
如何和何时使用 Sqlite
如何和何时使用 Sqlite
254 0
【qt】QListWidget 组件1
【qt】QListWidget 组件
300 0
|
开发框架 小程序 前端开发
小程序全栈开发中的跨平台解决方案
【4月更文挑战第12天】本文探讨了小程序全栈开发中的跨平台问题,包括前端、后端和数据交互差异,并提出了解决方案:使用跨平台框架(如Taro、uni-app)、设计统一后端接口、创建API适配层以及利用云开发平台。这些方法旨在帮助开发者提高效率,实现一次开发多平台运行。随着技术进步,预计会有更多便捷的跨平台工具出现。
535 0