函数模板与模板的特例化

函数模板

模板的意义:对类型进行参数化

模板类型参数

c++使用class、typename关键字定义模板类型参数

  • 函数模板:不进行编译,因为类型还不知道
template <typename T>//定义一个模板参数列表
bool compare(T a,T b)//compare是一个函数模板
{
    cout<<"template compare"<<endl;
    return a>b;
}
  • 函数模板的实例化:从函数调用点开始进行实例化
    • compare<int>是函数名
    • compare只是模板名称
    • 故下述代码是对compare<int>函数的调用
compare<int>(1,2);
  • 模板函数:函数模板被实例化后的模板函数,才是要被编译器所编译的
    /*
    模板函数:在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来
    bool compare(int a,int b)
    {
        cout<<"template compare"<<endl;
        return a>b;
    }
    */
  • 模板的实参推演:根据用户传入参数的实参类型,来推导出模板类型参数的具体类型

    //模板的实参推演
    compare(3,4);

完整代码

template <typename T>//定义一个模板参数列表
bool compare(T a,T b)//compare是一个函数模板
{
    cout<<"template compare"<<endl;
    return a>b;
}

void test()
{
    compare<int>(1,2);
    /*
    模板函数:在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来
    bool compare(int a,int b)
    {
        cout<<"template compare"<<endl;
        return a>b;
    }
    */
    compare<double>(3.4,2.1);
    /*
    bool compare(double a,double b)
    {
        cout<<"template compare"<<endl;
        return a>b;
    }
    */

    //模板的实参推演
    compare(3,4);
}

模板的特例化

void test()
{
    compare("aaa","bbb");
    /*实例化后的模板函数
    bool compare(const char* a,const char* b)//compare是一个函数模板
    {
        cout<<"template compare"<<endl;
        return a>b;
    }
    */
}

 如上代码所示,上述代码实例后的代码运行后显然是错误的,因为对于char*类型的变量来说,其return a>b返回的结果是它们所指向的内存地址的大小关系,而并不是我们想要的ASCII大小,这是因为指针本身就是一个地址值,其大小关系与其指向的内存空间大小关系一致。

如果要比较两个字符串的大小关系,应该使用字符串比较函数(如 strcmp)来进行比较。这些函数将会比较两个字符串的内容,而不是它们对应的指针地址。

我们想要的真正代码应该为:

    
    bool compare(const char* a,const char* b)//compare是一个函数模板
    {
        return strcmp(a>b)>0;
    }
    

因此,对于这种情况,需要对模板进行特例化,可以使得当我们调用char*类型的模板函数。

template <typename T>//定义一个模板参数列表
bool compare(T a,T b)//compare是一个函数模板
{
    cout<<"template compare"<<endl;
    return a>b;
}

//针对compare函数模板,提供const char*类型的特例化版本
template<>
bool compare(const char* a,const char* b)
{
    cout<<"compare<const char*> template"<<endl;
    return strcmp(a,b)>0;
}

测试

void test()
{
    compare(1,2);
    compare("aaa","bbb");
    /*
    bool compare(const char* a,const char* b)//compare是一个函数模板
    {
        cout<<"template compare"<<endl;
        return strcmp(a>b)>0;
    }
    */
}

 

需要注意的是,函数模板的特例化实现前提是必须要有函数模板 

模板非类型参数

模板的非类型参数只能使用,不能修改,必须是整数类型(地址、引用都可)

//T是一个类型参数,SIZE为非类型参数
template <typename T,int SIZE>
void sort(T* arr)
{
    for(int i=0;i<SIZE-1;i++)
    {
        for(int j=0;j<SIZE-1-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                int tmp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tmp;
            }
        }
    }
}

测试

void test()
{
    int arr[]={12,5,7,8,9,5,4,6,2,5,3};
    const int size=sizeof(arr)/sizeof(arr[0]);
    sort<int,size>(arr);

    for(int a:arr)
    {
        cout<<a<<" ";
    }
    cout<<endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通用二进制方式安装MySQL8.0.x

一、必要说明 1、系统&#xff1a;openEuler操作系统 2、版本&#xff1a;MySQL - 8.0.36 3、下载地址&#xff1a;https://dev.mysql.com/get/Downloads/MySQL-8.0 二、安装步骤 1、下载glibc版本的Mysql [rootnode2 ~]# wget -c https://dev.mysql.com/get/Downloads/MySQ…

C++ bfs反向建图(六十)【第七篇】

今天我们来学习一下bfs反向建图 1.bfs的反向建图 我们之前在图上求最短路都是求从起点出发到每个点的最短路&#xff0c;不过有时候我们也会遇到让求每个点到终点的最短路的问题&#xff0c;此时我们可以怎么做呢&#xff1f; 如果从每个点出发&#xff0c;用 BFS 搜索到终点…

测试开发【Mock平台】13基础:拦截器服务实现(四) 简单规则匹配逻辑

【Mock平台】为系列测试开发教程&#xff0c;从0到1编码带你一步步使用Spring Boot 和 Antd React框架完成搭建一个测试工具平台&#xff0c;希望作为一个实战项目对各位的测试开发学习之路有帮助&#xff0c;关注公众号发送“mock”获取github项目源码地址&#xff0c;大奇一个…

RocketMQ—RocketMQ消息重复消费问题

RocketMQ—RocketMQ消息重复消费问题 重复消费问题的描述 什么情况下会发生重复消费的问题&#xff1a; 生产者多次投递消息&#xff1a;如果生产者发送消息时&#xff0c;连接有延迟&#xff0c;MQ还没收到消息&#xff0c;生产者又发送了一次消息&#xff1b; 消费者方扩容…

【漏洞复现-通达OA】通达OA WHERE_STR 存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA WHERE_STR存在前台SQL注入漏洞,攻击者可通过该漏洞获取数据库敏感信息。 二、影响版本 ●…

将其它输入法的词库转换为微软拼音输入法的自学习词库

上班第一天&#xff0c;我删除了搜狗输入法 曾几何时&#xff0c;搜狗拼音输入法&#xff0c;以丰富的词库&#xff0c;实用的设置成为我电脑端主要的中文输入法。但新年上班的第一天&#xff0c;我彻底删除了它&#xff0c;回归到微软拼音输入法。因为&#xff0c;最近&#…

同学在外包干了两年的点点点,24岁人就快废了

前言 简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快两年了我薪资、技术各个方面都有了很大的提升&#xff0c;他在外包干的这两年人都要废了&#xff0c;技术没一点提升&#xff0c;学不到任何东西&…

辽宁博学优晨教育科技有限公司视频剪辑培训靠谱吗?

在数字媒体日益繁荣的今天&#xff0c;视频剪辑已成为一项炙手可热的技能。不少培训机构纷纷涉足这一领域&#xff0c;辽宁博学优晨教育科技有限公司便是其中之一。然而&#xff0c;面对众多的选择&#xff0c;很多人不禁要问&#xff1a;辽宁博学优晨教育科技有限公司的视频剪…

中国传媒网CEO徐晓艺:媒体融合发展业态新媒体年后在沪召开

近日,在“坚守媒体初心,拥抱AI时代”2023外滩新媒体年会上,有多项合作达成。 在当前竞争激烈的市场环境中,媒体宣传已经成为企业品牌推广不可或缺的一环。对于很多企业来说往往会犯一个错误,就是默默地参加了展会,并没有进行媒体营销。展会是一种非常有力的宣传和推广方式,可以…

网络安全综合实验

1.实验拓扑 在这里注意因为第四个要求配置双击热备&#xff0c;我们可以第一时间配置&#xff0c;避免二次重复配置消耗时间 4、FW1和FW3组成主备模式的双机热备 具体配置位置在系统-->高可靠性-->双机热备-->配置 这里上行链路有两组&#xff0c;分别为电信和移动&…

RK356x U-Boot研究所(驱动篇)4.2.2 DRM代码结构分析

谈到 drm 就涉及到 libdrm 库,它是一个跨驱动的中间件,它允许用户空间应用(例如作为Mesa和2D驱动程序)通过DRI与内核通信协议。 如下DRM结构图: libdrm 是DRM下沟通驱动和用户层的库。过去APP可能是使用open(framebuff)这样的方式来和图形驱动沟通,但是在现在的硬件演化…

【项目管理】CMMI-项目监督和控制

项目监督和控制&#xff08;Monitoring and Control, MC&#xff09;的目的是通过周期性地跟踪项目计划的各种性能参数如工作产品的规模、工作量、成本、进度、风险等&#xff0c;不断地了解项目的进展情况&#xff0c;以便当项目实际进展状况显著偏离项目计划时能够及时采取纠…

【Flink入门修炼】1-4 Flink 核心概念与架构

前面几篇文章带大家了解了 Flink 是什么、能做什么&#xff0c;本篇将带大家了解 Flink 究竟是如何完成这些的&#xff0c;Flink 本身架构是什么样的&#xff0c;让大家先对 Flink 有整体认知&#xff0c;便于后期理解。 一、Flink 组件栈 Flink是一个分层架构的系统&#xf…

Shiro-05-5 分钟入门 shiro 安全框架实战笔记

序言 大家好&#xff0c;我是老马。 前面我们学习了 web 安全之 Spring Security 入门教程 这次我们来一起学习下另一款 java 安全框架 shiro。 什么是Apache Shiro&#xff1f; Apache Shiro是一个功能强大且易于使用的Java安全框架&#xff0c;它为开发人员提供了一种直…

压缩感知——革新数据采集的科学魔法

引言&#xff1a; 在数字时代&#xff0c;数据以及数据的收集和处理无处不在。压缩感知(Compressed Sensing, CS)是一种新兴的数学框架&#xff0c;它挑战了我们传统上对数据采集和压缩的看法&#xff0c;给医学图像、天文观测、环境监测等领域带来了颠覆性的影响。但到底什么…

模板(函数模板)---C++

模板目录 模板1.模板概念&#xff12;.泛型编程 1.函数模板1.1 函数模板语法1.2 函数模板注意事项1.3 普通函数与函数模板的区别1.4 普通函数与函数模板的调用规则1.5 模板的局限性1.6 函数模板案例 模板 1.模板概念 模板就是建立通用的模具&#xff0c;大大提高复用性。 模板…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-静态内存

目录 一、内存管理二、静态内存2.1、静态内存运行机制2.2、静态内存开发流程2.3、静态内存接口2.4、实例2.5、代码分析&#xff08;待续...&#xff09;坚持就有收货 一、内存管理 内存管理模块管理系统的内存资源&#xff0c;它是操作系统的核心模块之一&#xff0c;主要包括…

百度地图接口 | 实现校验收货地址是否超出配送范围

目录 1. 环境准备 2. 代码开发 2.1 application.yml 2.2 OrderServiceImpl &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Py…

Linux 动静态库

目录 库的概念 动静态库的制作 动态链接与静态链接 库的使用 库的概念 程序库&#xff08;Library&#xff09;&#xff0c;一般简称为“库”&#xff0c;是一组预先编写好的可重用代码的集合。这些代码可以包括函数、类、变量、常量、数据结构、宏等&#xff0c;它们通常…
最新文章