cpp 模板函数,类模板(1)

STM32F103C8T6 + GY-906红外测温:手把手教你用CubeMX和HAL库搞定IIC驱动(附完整工程) 本文详细介绍了如何使用STM32F103C8T6和GY-906红外测温传感器(基于MLX90614芯片)实现非接触式温度测量。从STM32CubeMX工程创建、HAL库驱动适配到温度数据采集与处理,提供完整的开发流程和常见问题解决方案,帮助开发者快速掌握红外测温技术。 阅读详情

对应《c++ primer 第五版》的第16章前半部分,这里是一个简单的总结。

为了防止对每个不同的类型都定义一个函数,可以使用通用的模板,一个函数模板就是一个公式,可用来生成针对特定类型的函数版本。

模板定义以template开始,后面跟一个模板参数列表,用< >括起来。
模板定义中,模板参数列表不能为空。

模板参数列表就像函数的参数列表一样,在运行时要用实参来初始化形参。
当使用模板时,显式或隐式地指定模板实参,将其绑定到模板参数上。
比如定义了一个模板函数compare

template<typename T> 
int compare(const T &v1, const T &v2)

使用时,如果这样用

compare(1, 0)

就相当于instance化了一个特定版本的函数,T绑定了int。

声明为inline或者constexpr的,inline这个关键字要放在模板参数列表之后,返回类型之前,如下

template <typename T> inline T min(const T&, const T&)

类型参数前必须使用关键字class 或 typename, 可以看到上面都用的是typename,
也可以用

template <class T>

因为typename是在模板已经广泛使用之后才引入cpp语言中的,所以一些程序员仍然只用class

每个类型参数前必须使用class 或者 typename, 下面这样做是不对的

template <typename T, U>  //这样不对,U前也必须用typename 或 class

说下模板的编译:

编译器遇到一个模板定义时,并不生成代码,只有当实例化时才会生成代码。
大多数编译错误是在实例化期间报告的
第 1 阶段编译模板本身时,会检查语法错误,比如忘记分号。
第 2 阶段 编译器遇到模板使用时,对函数模板的调用,会检查实参数目是否正确。
第 3 阶段实例化时,只有这个阶段才能发现类型相关的错误,这类错误可能在link时才报告。

类模板:

类模板也是以关键字template开始,后面跟模板参数列表

template <typename T> class Blob {
    ...
};

这里要说下阅读模板类代码时,要记住类模板的名字不是一个类型名,比如

template<class SEMANTICS>
bool SemanticsOcTreeNode<SEMANTICS>::isSemanticsSet() const
{
  return this->semantics.isSemanticsSet();
}

SEMANTICS semantics;

可以看到isSemanticsSet函数是semantics对象的函数,但是要知道SEMANTICS并不是一个类型名,它具体是什么类型,要看调用它的地方传的是什么实参类型。

和其他类相同,既可以在类模板内部,也可以在类模板外部定义其成员函数。
且定义在类模板内的成员函数被隐式声明为inline函数。

为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义,因此,函数模板和类模板成员函数的定义通常放在头文件中。

在类模板自己的作用域中,可以直接使用模板名而不提供实参,如下

template <typename T> class B {
   ...
   B& operator++();  //这里不需要指定B<T>
};

但是,当定义在类模板外时,就要加上

friend class

如果模板类包含一个非模板friend class, 那么友元被授权可以访问所有模板实例,
如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例。
具体下次再码。

Ansys Lumerical | 薄膜铌酸锂电光调制器的仿真与优化 本文详细介绍了使用Ansys Lumerical进行薄膜铌酸锂电光调制器仿真与优化的全流程。从基础原理到电学仿真、光学模拟技巧,再到设计优化实战经验,帮助工程师掌握这一先进光电器件的仿真方法。重点解析了薄膜铌酸锂的Pockels效应和Mach-Zehnder结构设计,并提供了常见问题排查指南和最新发展动态。 阅读详情

相关推荐

本地AI代码助手:智能解析大型代码库,实现自动化重构与理解

在软件开发中,大型代码库的理解与维护是常见挑战。传统方法依赖人工阅读和有限上下文工具,效率低下。通过结合检索增强生成(RAG)和多智能体(Multi-Agent)架构,现代AI工具能够智能解析代码结构,理解模块关系,并精准定位相关代码片段。这种技术不仅能提升代码探索效率,还能自动化执行重构、文档生成等任务,在遗留系统维护、快速上手新项目等场景中发挥关键作用。本文以blackboxaicode/cli为例,展示了如何利用其代码感知和Workflow Automation能力,高效处理复杂代码库。

weixin_30240349的博客 362

C++ 模板函数的使用

因为C++是强类型的语言,所以不能够像动态语言Python、lua等语言一样,编写一段通用的语言,可以将不同类型的变量传进去直接处理。泛型编程解决了这个问题,通过设计模板,摆脱了类型的限制,提高了代码的可重用性。 普通的模板函数: template<typename T> T compare(const T &a, const T &b) { return...

slowlytalk 1833

Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解

在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by cluster by 一、order by(全局排序) 1、作用:全局排序,只有一个reducer。 order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序),也正因为只有一个reducer,所以当输入的数据规模较大时会导致计算时间较长。   set hive.mapr

weixin_43230682的博客 1万+

C++模板

1. 名词概念 模板类,模板函数,特化模板(template specialization) 2. 注意事项 模板必须在头文件中实现,以下情况除外:如果只在cpp内用到的模板函数,是可以在cpp中实现的,参见oceanbase/updateserver中的response_data_函数;还有特化的模板函数,也可以在cpp中实现,参见oceanbase/updateserver中的ups_s...

java开发指南博客 【转载】 190

LC滤波器设计实战:从理论计算到PCB布局的完整指南

滤波器是信号处理与电路设计中的基础组件,用于从复杂信号中提取特定频率分量或抑制干扰噪声。其核心原理基于电感(L)和电容(C)等无源元件的频率选择特性,通过特定的网络拓扑实现幅频与相频特性的塑造。在工程实践中,LC滤波器因其结构简单、可靠性高、成本可控,成为射频、模拟及电源电路中的关键技术手段。其设计价值在于将理论网络综合转化为可量产、高性能的硬件解决方案,广泛应用于通信系统、音频处理、电源净化和传感器信号调理等场景。本文聚焦于LC滤波器的工程设计全流程,深入剖析了巴特沃斯、切比雪夫等经典类型的选型权衡,并重

weixin_34194829的博客 273

ArcGIS Pro中如何批量替换数据源

不知您是否遇到过下面情况:ArcGIS Pro的Map/Scene中所引用的数据源被移动或重命名了,导致Map/Scene中找不到之前的数据,出现红色叹号;已有一个Map模板文件,图层的样式符号都是设置好的,想批量设置成另外一个数据源,复用该模板文件中的样式符号。 如果您在ArcGIS Pro的使用过程中遇到了上面情况,那么可以参考本篇文章,本文以图层存储在同一GDB中为例介绍。 情况一:Map中已有图层的数据源被移动了 原始Map长这样: 当数据源位置改变之后,显示找不到数据源的红色叹号: 这时如果右

xinying180的博客 7945

C++模板中声明和定义是否可以分开存放在.h和.cpp文件中

虽然我们遇到的绝大多数情况下,模板中函数的声明和定义都放在头文件中,但我想肯定有人和我一样,想知道是否可以分开存放。动手实验后,会发现有的可以,有的会报错,其实,这和编译器有关。         要弄清楚这个问题,首先要解决两个问题。         第一,为什么要把函数的声明放在头文件中,而定义放在.cpp文件中? 除了隐藏代码之外,如果将函数的定义也放入头文件中,那么每个include了这

u013403052的博客 6706

新能源知识库(62)组串式、集中式和高压直挂式

因需多台PCS及独立监控设备,单位功率成本比集中式高15%–20%。高压直挂式因省去变压器,大容量项目成本更低(>5MW时优势显著)。组串式储能、集中式储能和高压直挂式储能是当前主流的三类技术路线,其核心差异源于系统架构和控制逻辑的设计差异。组串式交流侧需变压器升压至10kV/35kV,高压直挂式可直接输出6kV/35kV电压,减少转换损耗。多台小功率PCS并联(每簇独立管理)单台大功率PCS(多簇直流侧并联)环流导致容量衰减(损失5%–8%)无变压器损耗(效率>99%)高压直挂电站(≥10MW)

竹君子之家 1514

C++类模板和函数模板声明和定义几种写法

};声明和实现分离,include了头文件之后不会把实现的代码也加入到该编译单元。然后需要将所有用到的类型都显式的实例化。. . . };

喜欢打篮球的普通人 632

汽车UDS诊断详解及Vector相关工具链使用说明——总述

1.什么是诊断 车辆在运行过程中,不可避免地会发生一些故障,为了确保行车安全,我们要求车上的ECU能够实时监测部件的运行状态,一旦发现异常情况,能通过点亮报警灯等方式提示驾驶员。但是,点亮报警灯只能告诉驾驶员车辆发生了故障,最多只能定位到故障ECU,比如ABS报警灯亮说明ABS系统出现故障,但具体是什么部件发生故障并不能通过报警灯显示出来。这时就需要ECU在本地存储一个与故障相对应的故障代码,在进行维修的时候,可以通过车上的OBD接口连接诊断仪,把这个存储的故障代码读取出来,从而进一步定位到更加具体的故障部

weixin_42967006的博客 2万+

使用PostgreSQL构建高可用数据库集群

在现代企业级应用中,数据库的高可用性已成为业务连续性的核心要求。PostgreSQL作为一款功能强大的开源关系型数据库,其高可用架构的设计直接影响着系统的稳定性和可靠性。

九天的专栏 1257

cpp中的函数模板

之前我们讲了函数重载,对一个不同参数类型的函数作出了不同的行为,但是其实有一个更加高效的方式,那就是函数模板,也叫泛型编程。或者模板元编程。下面是一个交换两个元素的例子我们只需要在调用时指定类型就可以我们也可以指定两种类型,下面的程序没有什么实际意义,就是为了展示一下

Lyajpunov的博客 1434

YOLO系列算法改进 | C3k2改进篇 | 融合DEConv细节增强卷积模块 | 细节增强+多分支差分卷积融合,标准卷积的完美涨点替代! | TIP 2024

YOLO系列算法改进 | C3k2改进篇 | 融合DEConv细节增强卷积模块 | 细节增强+多分支差分卷积融合,标准卷积的完美涨点替代! | TIP 2024 (以YOLO26最新目标检测模型为基础,融合C3k2_DEConv创新模块进行改进)

2502_91881744的博客 310

类模板里面的函数写在类模板里面和写在类模板的外面,且在1个.cpp文件中

和类一样,类模板里面声明的函数,其函数体写在类里面和外面都行,但是有一点需要注意:1.用友元函数重载<< 或 >>运算符,函数声明写在类模板里面,函数实现写在类模板外面,要在函数名和函数输入参数之间写上Typename定义的那个类型,如template <typename T>,则应写上<T>。举个例子,如果重载运算符<<,且重载函数的函...

weixin_30377461的博客 538

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

从0到1入门C++编程——08 函数模板和类模板

本文是函数模板和类模板的简单介绍,文中分别对函数模板和类模板的一些简单应用做了说明,每部分的介绍都附有代码和程序运行结果。

西岸贤 1152

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c++函数模板和类模板——DAY1

1.什么时候使用函数模板和;类模板:函数的业务逻辑一样,但函数类型参数不一样,为了方便程序员的编程。 template T相当于一个类型。template是告诉c++编译器,我要开始泛型编程了,不要随便报错。 函数模板的调用:   1.显示类型调用    myswap(x,y); <>表示要参数化的数据类型   2.自动类型推导(不常用,不好用)直接调用函数     例:mys...

qq_41536360的博客 157

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

一文搞懂C++泛型编程【函数模板、类模板】(1)

i < 10;i++) {return 0;

2301_76278775的博客 901

c++模板(函数模板和类模板)part_1

一、函数模板 1.作用: 建立一个通用函数,其函数的返回值类型可以不具体定制,用一个虚拟类型代替 2.语法: template<typename T> //函数声明或者定义 //template---声明创建函数模板 //typename---表明其后的符号是一种数据类型,可以用class代替 //T--- 通用数据类型 虚拟类型 可以换名称(H\J\...) 3.示例:实现两个数据交换 通常: #include<iostream> us...

快乐不能半途而废的博客 657

C++笔记7:C++提高编程1:模板—[函数模板和类模板]

0820 引言: C++除了面向对象编程思想,还有泛型编程思想。 泛型编程主要是利用模板技术来实现的。 1.模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性。 模板的特点: ①模板不可以直接使用,它只是一个框架而已; ②模板不是万能的。 1.2 函数模板 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。 1.2.1 语法 template //函数声明或定义 其中: template — 声明创建模板 typename — 表面其后面的符号是一种数据

weixin_38665351的博客 304

C++类模板:1.类模板语法 2.类模板和函数模板的区别 3.类模板中成员函数创建时机 4.类模板对象做函数参数的三种方法 5.两种方法继承类模板 6.模板类构造函数,普通函数的类外实现

template < typename T > 类template : 是声明创建模板tupename : 后跟数据类型,可以用 class 代替T : 通用的数据类型,名称可以替换。

分享计算机视觉,C++,网络摄像头研发,音视频开发,嵌入式等知识。 510

17. C++模板(template)1(泛型编程,函数模板,类模板)

C++泛型编程的介绍,函数模板和类模板的介绍和简单使用

yzc的博客 1339

5.1.1 C++函数模板和类模板注意事项

2.将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制。·1.当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型。·2.2函数模板调用时,如果利用“显示指定类型”的方式,可以发生隐式类型转换。·2.1函数模板调用时,如果利用“自动类型推导”,不会发生隐式类型转换。·1.自动类型推导,必须推导出一致的数据类型T,才可以用。·1.如果函数模板和普通函数都可以实现,优先调用普通函数。·3.如果想灵活指定出父类中T的类型,子类也需变为类模板。

wgf350357114的博客 449

c++模板的简单介绍(1:函数模板 2:类模板 )

以下是阿鲤对模板的总结,希望对大家有所帮助,若有误请慷慨指出;下面是目录。 1:函数模板 2:类模板 1:函数模板 1.1 函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 1.2:函数模板格式 请先看下面的例子; #include<iostream> using namespace std;...

belongHWL的博客 323

C++:6.1函数模板与类模板整理

函数模板:1、类型的参数化:   在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。   值和类型是数据的两个主要特征,它们在C++中都可以被参数化。   所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型,形参类型,局部变量类型)可以不具体指定,而是用一个虚函...

qq_40284771的博客 284

C++模板与泛型编程(1.函数模板与类模板)

所谓泛型编程就是以独立于任何特定类型的方式编写代码,模板是泛型编程的基础。1.函数模板我们经常会遇到需要编写函数比较两个对象大小的情况,比如需要比较两个int值得大小、两个char值的大小等等,在C++以前,我们需要为每一种对象编写对应的函数,甚至必须取不同的函数名,有了C++以后,还没接触到泛型编程前我们可能会利用函数重载来避免要取多个不同名字的麻烦,但还是需要编写多个函数:int compare

ccyanxyz的博客 462

黑马程序员C++教程从0到1入门编程12模板--类模板对象做函数参数

黑马程序员C++教程从0到1入门编程05模板--普通函数和模板函数的差别普通函数和模板函数的差别例子 普通函数和模板函数的差别 普通函数调用可以发生隐式类型转换 函数模板 用自动类型推导。不可以发生隐式类型转换 函数模板用显示指定类型,可以发生隐式类型转换 用自动类型推导。不可以发生隐式类型转换的原因是,因为编译器不知道要转换成哪一个数据类型 例子 #include <iostream&gt...

浪里小河马的博客 232
上一篇: leetcode 509. Fibonacci Number(斐波那契数字)
下一篇: Semantic SLAM源码解析
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值