【C++】什么是函数模板/类模板?

news2024/11/28 11:00:41

文章目录

  • 一、函数模板
    • 1.什么是函数模板?
    • 2.函数模板格式
    • 3.函数模板原理
    • 4.函数模板实例化
      • (1)隐式实例化
      • (2)显示实例化
  • 二.类模板
    • 1.类模板定义格式
    • 2.类模板的实例化
  • 总结


一、函数模板

在这里插入图片描述

1.什么是函数模板?

函数模板简单来说就是一个模板,与函数参数的类型无关,是一个模子,不是真正的函数,实例化的函数会根据实参的类型自动推导类型。

2.函数模板格式

template<typename T1,typename T2...>

返回值类型 函数名(参数列表)
{}

3.函数模板原理

函数模板是一个模板,并不是真正的函数,它是根据传递过来的实参的类型实例化一个具体的函数,相当于我们将重复的事情交给了编译器来操作。

比如说:

template<typename T>

T Add(const T& a1, const T& a2)
{
    return a1 + a2;
}


int main()
{
    int a = 10, b = 20;
    double c = 3.14,d = 2.11;
    cout << Add(a, b) << endl;
    cout << Add(c, d) << endl;	
    return 0;
}

我们定义了一个加法函数的函数模板,来进行加法操作,函数模板会根据我们传递的实参的类型自动实例化出不同的Add函数,这些函数之间构成函数重载。

4.函数模板实例化

(1)隐式实例化

举一个简单的例子:
在我们定义的函数模板中,只给定一个模板参数类型,但是我们可能会有两个不同的实参类型。

template<typename T>

T Add(const T& a1, const T& a2)
{
    return a1 + a2;
}


int main()
{
    int a = 10;
    double b = 20.3;
    cout << Add(a, b) << endl;

    return 0;
}

对于只有一个类型的函数模板,却同时出现了两种不同类型的实参,编译器就无法确认到底用哪个实参类型实例化了。

解决办法:

int main()
{
    int a = 10;
    double b = 20.3;
    cout << Add((double)a, b) << endl;
	
	cout << Add(a, (int)b) << endl;
	//可能存在精度丢失的情况
    return 0;
}

隐式类型转换,就可以解决编译器无法识别的情况。

(2)显示实例化

template<typename T>

T Add(const T& a1, const T& a2)
{
    return a1 + a2;
}


int main()
{
    int a = 10;
    double b = 20.3;
    cout << Add(a, b) << endl;

    return 0;
}

对于这个案例,还有一种解决方案:

int main()
{
    int a = 10;
    double b = 20.3;
    cout << Add<int>(a, b) << endl;

    return 0;
}

这样的方法叫做显式实例化,实际生活中,我们很少会遇到需要显式实例化的情况,不过对于下面的情况,就必须要显式实力化。

template<class T>
T* Alloc(int n)
{
    return new T[n];
}

int main()
{
    Alloc<double>(10);
    return 0;
}

在这样的情况下,我们没有使用函数模板类型,所以仅仅传递实参n无法推导T的类型,这种情况下必须要使用显式实例化。

二.类模板

1.类模板定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
	// 类内成员定义
};

2.类模板的实例化

注意:

普通类的类型和类名相同
模板类的类型和类名不同

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可。

类模板名字不是真正的类,而实例化的结果才是真正的类。

比如:

// string类名,string<int>才是类型
string<int> s1;
string<double> s2;

1.不管是类模板还是函数模板,其作用范围就是紧跟着的类/函数。

也就是看{}

2.类模板中函数放在类外进行定义时,需要加模板参数列表
比如:

template<typename T>
class Stack
{
public:
    Stack(size_t capacity = 3);

    void Push(const T& data);   

    // 其他方法...
    ~Stack()
    {
        if (_array)
        {
            delete[]_array;
            _capacity = _size = 0;
        }

    }

private:
    T* _array;
    int _capacity;
    int _size;
};

//缺省参数不能给在函数定义,只能在声明给缺省值
//模板的作用域就是专门给一个函数或者一个类用的
//可以看{}的作用范围是那里,模板的作用范围就是哪里。
template<typename T>
Stack<T>::Stack(size_t capacity)
{
    _array = new T[capacity];
    _capacity = capacity;
    _size = 0;
}

template<typename T>
void Stack<T>::Push(const T& data)
{
    // CheckCapacity();
    _array[_size] = data;
    _size++;
}

函数在类外面进行定义时,需要加类模板的参数列表。

注意:不建议模板实例化出来的函数的声明和定义分离。
注意:不建议模板实例化出来的函数的声明和定义分离。
注意:不建议模板实例化出来的函数的声明和定义分离。

上面的例子仅仅是为了演示。


总结

本文讲述了函数模板和类模板的相关问题。

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

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

相关文章

VBA之正则表达式(42)-- 提取代码中变量名称

实例需求&#xff1a;待处理代码段如下所示&#xff0c;现在需要提取其中的变量名称。 Public pFactor As Integer Sub TestCode() Dim reg As New RegExp, a As Workbook Dim ms As VBScript_RegExp_55.MatchCollection Dim m As VBScript_RegExp_55.Match Dim i, j Dim x1, y…

记一次udp服务性能优化经历

目录 概述磁盘io网络io减少重复计算减少内存复制减少互斥锁 概述 手上有个go项目&#xff0c;接收udp信息&#xff08;主要是syslog和snmp trap&#xff09;并查询设备信息&#xff0c;将信息结构化&#xff08;设备ip名称&#xff0c;匹配了什么规则之类的&#xff09;后发送…

生态系统NPP及碳源、碳汇模拟(土地利用变化、未来气候变化、空间动态模拟)

前言 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放&#xff08;碳源&#xff09;和碳固定&#xff08;碳汇&#xff09;这两个侧面来理解。陆地生态系统在全球碳循环过程中有着…

综述:图像分割

综述 图像分割(segmentation、cut)指的是将数字图像划分成多个图像子区域的过程。 在实际场景中具有诸多重要应用 在广义的图像分割中&#xff0c;传统方法和深度方法对于分割有不同的定义。 传统方法&#xff1a;对于图像进行区域划分&#xff0c;核心问题在于&#xff1a;区…

饿了么太狠:面个高级Java,抖这多硬活、狠活(饿了么面试真题)

前言&#xff1a; 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴需要面试饿了么、 头条、美团、阿里、京东等大厂。有很多的小伙伴&#xff0c;完成了人生的逆袭&#xff0c;拿到了高端的offer。 最近一个6年经验的小伙伴&#xff0c;年…

linux进程间通信(共享内存)

共享内存&#xff0c;顾名思义就是允许两个不相关的进程访问同一个逻辑内存&#xff0c;共享内存是两个正在运行的进 程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可 以将同一段物理内存连接到他们自己的地址空间中&#xff0…

win10 编译 openssl

环境:系统win10 编译器:VS2015 准备: 一、openssl下载 官网&#xff1a;www.openssl.org 安装Perl,安装NASM. cmd下运行perl --version得出下面信息就说明安装perl安装成功. nasm --version得出下面信息,说明nasm安装成功 我以vs2015为例: 打开这个终端,之所以打开这个是因…

适合每一个对高光谱技术感兴趣,并想用python进行实践的人

总结了高光谱遥感技术领域的基础原理与核心概念&#xff0c;采用编程语言复现经典数据处理和应用方法&#xff0c;追踪了最新的技术突破&#xff0c;在消化理解、触类旁通之后&#xff0c;用即使是遥感“小白”也容易接受的方式分享给你。 高光谱遥感学习的第一季&#xff1a;提…

HTTP的缓存机制是什么?

HTTP 缓存机制是一种在 Web 开发中常用的技术&#xff0c;它旨在提高性能和减少网络流量。通过缓存&#xff0c;可以避免不必要的网络请求&#xff0c;减少服务器负载&#xff0c;并加快页面加载速度。下面是关于 HTTP 缓存机制的详细介绍。 HTTP 缓存机制的基本原理是将 Web …

LNMP网站框架搭建(yum方式)

目录 一、Nginx的yum安装 1&#xff09;搭建nginx相关的yum源 2&#xff09;刷新yum仓库&#xff0c;安装启动nginx服务 二、mysql的 yum 安装 1&#xff09;卸载一切与mysql有关的包 2&#xff09;wget mysql相关的yum源 附加&#xff1a;第二种方式&#xff08;与上…

单卡轻松打造 ChatGPT 竞争者“原驼”,QLoRA 革新大语言模型微调技术

出品人&#xff1a;Towhee 技术团队 作者&#xff1a;顾梦佳 由 OpenAI 推出的聊天机器人ChatGPT 爆火&#xff0c;带动 AI 受到了前所未有的关注。随之市面上也涌现出了各类开源的大语言模型&#xff08;LLM&#xff09;&#xff0c;其中 LLaMA “羊驼系列”最受关注、最具潜力…

Vue实现订单确认界面禁止浏览器返回操作导致重复提交订单的问题

哈喽 大家好啊 最近遇到一个问题&#xff0c;就是在提交订单成功后的页面&#xff0c;然后用户去浏览器返回&#xff0c;就导致又提交了一次 然后就想到了如果提交成功页面&#xff0c;就阻止浏览器返回操作 主要实现如下&#xff1a; 1.在mounted的钩子函数&#xff1a; 2.…

每日一练 | 华为认证真题练习Day50

1、SWA和SWB的MAC地址表中&#xff0c;MAC地址、VLAN、端口对应关系正确的有&#xff1f;&#xff08;多选&#xff09; 2、PPP帧格式中的Flag字段的取值为&#xff1f; A. 0xFF B. 0x7E C. 0xEF D. 0x8E 3、ICMP报文不包含端口号&#xff0c;所以无法使用NAPT。 A. 对 B…

[ Term ] 你真的了解 UTC 时间吗?它和 GMT 时间的区别是什么?

什么是 GMT 和 UTC&#xff0c;他们之间的区别是什么&#xff1f; GMT&#xff08;Greenwich Mean Time&#xff09;和UTC&#xff08;Coordinated Universal Time&#xff09;是两个不同的时间标准&#xff0c;但它们非常相似并且通常被混淆使用&#xff0c;那他们之间的区别在…

后端从入门到转岗,如何转型

一、技术介绍 我学习的技术很多&#xff1a; 例如&#xff1a;JAVA JS C# python vue mysql Oracle 等等。 学习也是从入门开始 &#xff0c;入口是JAVA 二、学习前的准备工作 学习前需要准备什么呢&#xff1f; 我觉得学习前最需要准备的是下定决心吃苦&#xff…

常见数据采集工具介绍

数据采集是指从各种数据源中收集数据并将其存储在一个地方&#xff0c;以便进行分析和处理。数据采集工具是帮助我们自动化数据采集过程的软件或服务。在本文中&#xff0c;我们将介绍一些常见的数据采集工具。 Web Scraper Web Scraper是一种免费的浏览器扩展&#xff0c;可…

低代码平台选型必看!让你少走弯路

目前低代码技术正处在风口&#xff0c;低代码平台产品不断涌现&#xff0c;乱花渐欲迷人眼。作为软件公司或企业IT部门的负责人&#xff0c;在做低代码平台的 选型时需要关注哪些方面&#xff0c;才能顺利“上车”&#xff0c;让低代码为自己的团队赋能&#xff1f; 除了产品功…

我的创作纪念日一周年

今天六一 祝大家节日快乐 &#xff01; 文章目录 机缘收获日常成就憧憬 机缘 其实好兄弟早在21年10月就已经注册了csdn账号&#xff0c;但是当初只是用来查找资料&#xff0c;也就是看别人写的博客吧&#xff0c;那时候感觉写博客好难&#xff0c;所以自己迟迟不敢尝试&#x…

如何将Linux命令默认的提示结果不显示或者不输出?以及在脚本中如何替代Ctrl + C等关闭命令的终端窗口?

一、问题描述&#xff1a; 当我们想要获取命令的输出结果时&#xff0c;有时候命令会带出一些默认的提示信息输出到屏幕上&#xff0c;如何过滤掉这个提示信息呢&#xff1f; 例如&#xff0c;telnet命令退出时会默认提示“Connection closed by foreign host.” 例如&#x…

如何使用一站式自动化测试平台TestOne进行App兼容性测试

首先&#xff0c;在讲主题之前&#xff0c;大家先了解移动兼容性测试包括哪些&#xff1f;然后再说&#xff0c;移动兼容性自动化测试方法有哪些&#xff1f;通过一站式自动化测试平台&#xff08;英文名称&#xff1a;TestOne&#xff09;&#xff0c;具体如何来实现&#xff…