函数模板与模板的特例化

函数模板

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

模板类型参数

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.hqwc.cn/news/478297.html

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

相关文章

electron桌面开发相关注意点

electron的部署以及配置 如果使用的是pnpm&#xff0c;请先配置一下镜像&#xff0c;否则会安装失败的&#xff1a; pnpm config set registryhttps://registry.npmmirror.com pnpm config set electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ pnpm config set …

如何构建企业专属GPT

大语言模型&#xff08;LLM&#xff09;具有令人印象深刻的自然语言理解和生成能力&#xff0c; 2022年11月底OpenAI发布了ChatGPT&#xff0c;一跃成为人工智能AI领域的现象级应用。但由于LLM的训练数据集主要来源于互联网数据&#xff0c;企业私域信息并未被LLM所训练&#x…

Dom节点继承树基本操作

遍历节点树 基于元素节点树的遍历 parcntElcrmcnt -> 返回当前元素的父元秦节点 (IE不兼容)children ->只返回当前元素的元素子节点node.childFlement(ount nodechildren.length当前元素节点的子元素(IE不兼容)firstElementChild->返回的是第一个元素节点(IE不兼容)l…

TRS 2024 论文阅读 | 基于点云处理和点Transformer网络的人体活动连续识别

注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学报 等)。 本次介绍的论文是:<IEEE Transactions on Radar …

npm run dev运行出现NODE_OPTIONS=--max_old_space_size=4096 vite --mode dev --host?

问题描述 PS E:\AWorkDataease\DataEase\core\core-frontend> npm run dev dataease0.0.0 dev NODE_OPTIONS–max_old_space_size4096 vite --mode dev --host 0.0.0.0 ‘NODE_OPTIONS’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决方案 遇到…

CSS:BFC

BFC&#xff0c;Block Formatting Context&#xff0c;块级格式化上下文&#xff0c;是一个独立的渲染区域或隔离的独立容器&#xff0c;它决定了其子元素如何布局&#xff0c;并且与这个区域外部的元素无关。 形成 BFC 的条件 float 的值不为 none&#xff08;left、right&a…

无人机数据链技术,无人机数据链路系统技术详解,无人机数传技术

早期的无人机更多的为军事应用服务&#xff0c;如军事任务侦查等&#xff0c;随着技术和社会的发展&#xff0c;工业级无人机和民用无人机得到快速的发展&#xff0c;工业级无人机用于农业植保、地理测绘、电力巡检、救灾援助等&#xff1b;民用无人机用于航拍、物流等等领域。…

AcuAutomate:一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具

关于AcuAutomate AcuAutomate是一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具&#xff0c;该工具旨在辅助研究人员执行大规模的渗透测试任务。 在大规模的安全测试活动中&#xff0c;AcuAutomate可以帮助我们同时启动或停止多个Acunetix扫描任务。除此之外&#xff…

prometheus+mysql_exporter监控mysql

prometheusmysql_exporter监控mysql 一.安装mysql 1.下载&#xff1a;wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2.安装客户端&#xff1a;yum -y install mysql57-community-release-el7-10.noarch.rpm 3.安装服务端&#xff1a;yum …

服务器4c是什么意思?8g是什么?

4核8G是云服务器的参数&#xff0c;代表云服务器的硬件配置和网络带宽&#xff0c;4核代表CPU、8G是指内存、12M代表带宽值为12Mbps&#xff0c;腾讯云百科txybk.com以腾讯云轻量应用服务器4核8G12M带宽配置为例&#xff0c;来详细介绍下服务器参数&#xff1a; 4c8g是什么意思…

Linux环境下HTTP隧道的安全性与性能优化策略

在Linux环境下&#xff0c;HTTP隧道技术为远程办公和数据同步提供了极大的便利。为了确保这种技术的安全性和性能&#xff0c;我们需要采取一系列策略来保障其稳定运行。 安全性策略 安全性是HTTP隧道技术的首要考虑因素。以下是一些建议&#xff0c;以确保HTTP隧道的安全性&…

django连接本地数据库并执行增删改查

1&#xff0c;首先需要将本地数据库的表同步到django的models.py文件 py manage.py inspectdb tb_books tb_heros > demo001/models.py 2&#xff0c;同步成功后models.py会根据每张表映射出不同的类 models.py文件根据数据库表映射出对应的类 3&#xff0c;然后根据不同…