C/C++ - 函数模板

目录

函数模板基础

函数模板定义

函数模板实例

函数模板调用

函数模板本质

模板函数特化

模板参数限定

默认模板参数

多个模板参数

非类型模板参数

函数模板拓展

模板参数匹配规则


  • 函数模板基础

    • 函数模板定义

      • 使用 template <typename T>​​​​​ 或 template <class T>​​​​​ 语法来声明函数模板,并在函数定义中使用模板参数。
      • template <typename T>
        T max(T a, T b) {return (a > b) ? a : b;
        }
        
    • 函数模板实例

      • 在使用函数模板之前,需要进行模板实例化,将模板参数替换为具体的类型。实例化可以通过显式指定模板参数或使用自动类型推导来完成。
      • 显式实例化:可以使用<类型>​​​​的语法显式指定模板参数。例如,max<int>(5, 3)​​​​实例化了max​​​​函数模板为类型参数为int​​​​的版本。
      • 自动类型推导:C++11引入了自动类型推导,允许编译器根据函数实参的类型推导出模板参数的类型。例如,max(5, 3)​​​​可以自动推导为max<int>(5, 3)​​​​。
    • 函数模板调用

      • 一旦函数模板实例化完成,就可以像普通函数一样调用它。使用实际的参数来调用函数模板,并根据实参类型匹配合适的模板实例。
      • int main() 
        {int result1 = max<int>(5, 3);  // 显式实例化为max<int>(5, 3),返回5int result2 = max(3, 5);       // 自动类型推导为max<int>(3, 5),返回5double result3 = max<double>(3.14, 2.71);  // 显式实例化为max<double>(3.14, 2.71),返回3.14double result4 = max(2.71, 3.14);           // 自动类型推导为max<double>(2.71, 3.14),返回3.14return 0;
        }
        
    • 函数模板本质

      • int

        • ​​
        • ​​
      • float

        • ​​
        • ​​
    • 模板函数特化

      • 模板特化允许为特定的类型提供特殊的实现。可以为函数模板提供显式的特化版本,以处理特定类型的参数。
      • #include <iostream>template <typename T>
        T max(T num1, T num2)
        {return num1 > num2 ? num1 : num2;
        }//函数模板特化
        template <>
        const char* max<const char*>(const char* str1, const char* str2)
        {return strlen(str1) > strlen(str2) ? str1 : str2;
        }int main()
        {auto ret1 = max(222, 111);		//max<int>(222, 111);auto ret2 = max(3.14f, 6.66f);	//max<float>(3.14f, 6.66f);auto ret3 = max("Hell", "World");return 0;
        }
        
    • 模板参数限定

      • #include <iostream>template <typename Type>
        Type Max(Type obj1, Type obj2)
        {static_assert(std::is_integral<Type>::value || std::is_floating_point<Type>::value , "Error Type CC");return (obj1 > obj2) ? obj1 : obj2;
        }int main()
        {Max(111, 222);				//Max<int>Max(111.111, 222.222);		//Max<float>Max("Hell", "World");return 0;
        }
        
    • 默认模板参数

      • 可以为函数模板的模板参数提供默认值,使得在使用函数模板时,如果没有显式提供模板参数,将使用默认值。
      • #include <iostream>// 带有默认模板参数的函数模板
        template <typename T = int>
        void printValue(T value = 0) {std::cout << value << std::endl;
        }int main() {printValue();  // 使用默认模板参数 int,默认参数值为 0printValue(5);  // 使用默认模板参数 int,指定参数值为 5printValue(3.14);  // 推导为 double,默认参数值为 0.0printValue("Hello");  // 推导为 const char*,默认参数值为 nullptrreturn 0;
        }
        
    • 多个模板参数

      • 函数模板可以有多个模板参数。可以使用逗号分隔的方式声明多个模板参数,并在函数定义中使用它们。
      • template <typename T, typename U>
        void printPair(T key, U value) 
        {std::cout << "Key: " << key << ", Value: " << value << std::endl;
        }
        
    • 非类型模板参数

      • C++还支持非类型模板参数,允许在模板中使用非类型的值作为参数。
      • 非类型模板参数可以是整数、指针、引用、枚举、指向成员的指针等。
      • #include <iostream>//多个模板参数 & 非类型模板参数
        template <typename T, int N>
        T* CC_Alloc()
        {try{T* p = new T[N];for (size_t i = 0; i < N; i++){p[i] = 0;}return p;}catch (const std::exception& e){//std::bad::allocreturn NULL;}
        }int main()
        {auto* p = CC_Alloc<int, 5>();return 0;
        }
        
  • 函数模板拓展

    • 模板参数匹配规则

      • 当定义了多个模板参数则在函数内部必须使用否则编译器会报错

      • #include <iostream>template <typename T, typename N>
        T Fun(T t, T n)
        {return t;
        }int main()
        {//代码报错 -> 未使用 NFun(1, 1);return 0;
        }
        
      • 类型形式参数表中可以使用typename​​​和class​​​

      • #include <iostream>template <class T, class N>
        T Fun(T t, N n)
        {return t;
        }int main()
        {//代码报错 -> 未使用 Nreturn 0;
        }
        
      • 模板函数中参数不是基本类型时如果要想使用运算符操作需要类内部进行重载

      • #include <iostream>class Person
        {
        public:int m_Age;Person(int nAge): m_Age(nAge){}bool operator>(const Person& ref){return this->m_Age > ref.m_Age ? true : false;}
        };template <typename T>
        T Max(T param1, T param2)
        {return param1 > param2 ? param1 : param2;
        }int main()
        {Person p1(18);Person p2(28);auto p3 = Max(p1, p2);return 0;
        }
        
      • 函数重载机制下的普通函数与模板函数调用顺序

      • #include <iostream>template <typename T>
        T Max(T param1, T param2)
        {std::cout << "模板函数被调用了\r\n";return param1 > param2 ? param1 : param2;
        }int Max(int param1, int param2)
        {std::cout << "普通函数被调用了\r\n";return param1 > param2 ? param1 : param2;
        }int main()
        {auto p1 = Max(1, 2);auto p2 = Max<int>(1, 2);return 0;
        }
        
      • 函数模板的嵌套使用

        #include <iostream>template <typename T>
        void OuterFunction(T value) {std::cout << "OuterFunction: " << value << std::endl;
        }template <typename T>
        void InnerFunction(T value) {std::cout << "InnerFunction: " << value << std::endl;
        }template <typename T>
        void NestedFunction(T value) {OuterFunction(value);InnerFunction(value);
        }int main() {int number = 42;NestedFunction(number);std::string text = "Hello";NestedFunction(text);return 0;
        }
        

 

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

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

相关文章

ElementUI Form:Input 输入框

ElementUI安装与使用指南 Input 输入框 点击下载learnelementuispringboot项目源码 效果图 el-input.vue &#xff08;Input 输入框&#xff09;页面效果图 项目里el-input.vue代码 <script> export default {name: el_input,data() {return {input: ,input1: ,i…

SOME/IP SD 协议介绍(五)使用SOME/IP-SD宣布非SOME/IP协议的协议。

使用SOME/IP-SD宣布非SOME/IP协议的协议。 除了SOME/IP之外&#xff0c;车辆内部还使用其他通信协议&#xff0c;例如用于网络管理、诊断或闪存更新。这些通信协议可能需要传递服务实例或具有事件组。 对于非SOME/IP协议&#xff0c;应使用特殊的服务ID&#xff0c;并使用配置…

养猫家庭必备宠物空气净化器吗?性价比猫用空气净化器牌子推荐

家里的可爱猫咪们带来了很多快乐&#xff0c;但是它们的毛发却无处不在&#xff0c;飞舞在整个房间里。而且如果猫砂盆不及时清理&#xff0c;整个屋子都会弥漫着难闻的气味。每天都要清理工作&#xff0c;但是有时候我们也没有那么多精力。虽然享受着猫咪们带来的快乐&#xf…

C# wpf 字体图标预览,html字符与unicode转换

在进行wpf 开发工作过程中遇到字体图标无法预览的问题&#xff0c;特此记录。 1、把需要预览的字体文件上传到网站上进行转换 Create Your Own font-face Kits Font Squirrel2、下载文件后进行解压。 3、找到 Glyph Chart 查看字体html字符编码4、在wpf中直接使用即可 <…

C语言数据结构之二叉树

少年恃险若平地 独倚长剑凌清秋 &#x1f3a5;烟雨长虹&#xff0c;孤鹜齐飞的个人主页 &#x1f525;个人专栏 &#x1f3a5;前期回顾-栈和队列 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 目录 树的定义与判定 树的定义 树的判定 树的相关概念 树的运用…

AI魔幻巨制《魔戒4》电影宣传片

AI魔幻巨制《魔戒4》电影宣传片 中土世界的命运悬于一线。 争夺魔戒的最终战斗已经开始。 面对无边的黑暗&#xff0c;光明战士将挺身而出。 光明与黑暗在终极对决中碰撞。 英雄崛起&#xff0c;传奇重生。 最后的战斗即将来临。 谁是拯救世界的英雄&#xff1f; 想看哪部…

嵌入式学习第十六天

制作俄罗斯方块小游戏&#xff08;一&#xff09; 分析&#xff1a; printf函数高级用法 \033[&#xff1a;表示转义序列的开始 m&#xff1a;表示转义序列的结束 0&#xff1a;重置所有属性 1&#xff1a;设置粗体或高亮 30-37&#xff1a;设置字体色 30: 黑 31: 红 32:…

MySQL窗口函数--lead()函数

lead()函数&#xff1a; 查询当前行向下偏移n行对应的结果 该函数有三个参数&#xff1a;第一个为待查询的参数列名&#xff0c;第二个为向下偏移的位数&#xff0c;第三个参数为超出最下面边界的默认值。 如下代码&#xff1a; 查询向下偏移 2 位的年龄 SELECT user_id,user…

AI新工具(20240201) 字节推出了国内版的 Coze 扣子;ChatGemini-使用 Google 的生成式 AI 来生成对您的消息的响应

ChatGemini-使用 Google 的生成式 AI 来生成对您的消息的响应 ChatGemini 是一个基于 Google Gemini 的网页客户端&#xff0c;对标 ChatGPT 3.5&#xff0c;使用逻辑同 ChatGPT 3.5 一致&#xff0c;同时支持在聊天中上传图片&#xff0c;自动调用 Gemini-Pro-Vision 模型进行…

python+selenium的web自动化】- 元素的常用操作详解(一)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

旷视low-level系列(二):Practical Deep Raw Image Denoising on Mobile Devices

论文&#xff1a;ECCV 2020 代码&#xff1a;https://github.com/MegEngine/PMRID 文章目录 1. Motivation2. Contribution3. Methods3.1 噪声建模&参数估计3.2 k-Sigma变换3.3 移动端友好的网络结构 4. Experiments5. Comments 1. Motivation 业内周知&#xff0c;基于深…

信息安全管理体系

本文已收录至《全国计算机等级考试——信息 安全技术》专栏 信息安全管理体系&#xff08;Information Security Management Systems&#xff09;是组织在整体或特定范围内建立信息安全方针和目标&#xff0c;以及完成这些目标所用方法的体系。它是直接管理活动的结果&#xff…

力扣经典题:用栈表示队列

1.在元素入栈完成时&#xff0c;再出栈进入到另一个栈的时候&#xff0c;另一个栈的栈顶元素就是队列的队尾元素 2.初始化操作完全与上一题相同 3.peek函数的实现&#xff1a;将1的思路写出来&#xff0c;再返回第二个队列的栈顶元素 4.pop函数就是将peek函数进行实现后将to…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现SPI控制OLED屏幕

上一篇&#xff1a; [嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 [嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕 文章目…

HIS预约挂号系统源码 看病挂号快人一步

提到去大型医院机构就诊时&#xff0c;许多人都感到恐惧。有些人一旦走进医院的门诊大厅&#xff0c;就感到迷茫&#xff0c;既无法理解导医台医生的建议&#xff0c;也找不到应该去哪个科室进行检查。实际上&#xff0c;就医也是一门学问&#xff0c;如何优化时间分配&#xf…

AIGC专题:从0到1精益创新 AIGC产品应用及商业化落地实践

今天分享的是AIGC系列深度研究报告&#xff1a;《AIGC专题&#xff1a;从0到1精益创新 AIGC产品应用及商业化落地实践》。 &#xff08;报告出品方&#xff1a;易点天下&#xff09; 报告共计&#xff1a;38页 企业内部增效-AI知识库 企业内部IT、运维、人力资源、行政等等日…

都 2024 年了!程序员的到底出路在哪里!?继续卷技术?晋升管理层?还是转业?

都 2024 年了&#xff01;程序员的到底出路在哪里&#xff01;&#xff1f;继续卷技术&#xff1f;晋升管理层&#xff1f;还是转业&#xff1f; 1&#xff09;程序员的难处2&#xff09;程序员专业方向3&#xff09;大数据3.1.大数据开发涉及到哪些技术3.2.大数据开发涉及到的…

C语言assert断言详解指针(3)

各位少年&#xff0c;大家好&#xff0c;我是博主那一脸阳光&#xff0c;今天分享assert法官的断言&#xff0c;指针宝箱的使用。 前言&#xff1a;如果你在计算机的世界中触犯了语法法规&#xff0c;那么编译器就要上线了&#xff0c;就会出现报错。然而想想我们在现实中设计到…

仰暮计划|“一周一顿的玉米面和白面蒸的糕点,是当时所能吃到的极好的食物”

平淡又记忆深刻的一生 口述人&#xff1a;元奶奶 整理人&#xff1a;宋佳音 口述人基本信息&#xff1a;女 出生于1958年&#xff0c;今年65周岁&#xff0c;祖籍东北&#xff0c;现定居于上海&#xff0c;已从制药厂退休十余年。 元奶奶的自述&#xff1a; 我出生于1958年…

B样条基函数

​定义&#xff1a;令U{u0,u1,…,um}是一个单调不减的实数序列&#xff0c;即ui≤ui1&#xff0c;i0&#xff0c;1&#xff0c;…&#xff0c;m-1。其中&#xff0c;ui称为节点&#xff0c;U称为节点矢量&#xff0c;用Ni,p(u)表示第i个p次&#xff08;p1阶&#xff09;B样条基…