0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你们知道什么是函数模板、类模板?

FPGA之家 来源:嵌入式客栈 作者:嵌入式客栈 2021-05-17 15:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

[导读] 最近使用C++做些编程,把日常遇到的些比较重要的概念总结分享一下。本文来分享一下模板类的原理,以及为什么需要模板类,使用时的基本要点。

为什么需要模板

比如需要设计一个描述点的类,大致很快可以写成这样:

class Point_F { public: /*默认传入参数为0,0*/ Point_F(float x0 = 0, float y0 = 0) :x(x0), y(y0) /*初始化列表*/ { } /*用const修饰函数,表示函数不会修改成员数据*/ float get_x() const { return x; } float get_y() const { return y; } private: /*一般会将数据放在私有区,以对外隐藏*/ float x; float y; };

可问题是,在有的场合这点的坐标系有可能不需要浮点,比如界面设计中点往往是整型表示即可,那此时就需要再设计一个整型成员类:

class Point_I { public: /*默认传入参数为0,0*/ Point_f(int x0 = 0, int y0 = 0) :x(x0), y(y0) /*初始化列表*/ { } /*用const修饰函数,表示函数不会修改成员数据*/ int get_x() const { return x; } int get_y() const { return y; } private: /*一般会将数据放在私有区,以对外隐藏*/ int x; int y; };

可是在应用代码中,往往发现对于不同数据成员的应用操作确实基本类似,而且应用代码往往这两种(甚至更多成员数据类型)都可能会同时用到,仅仅因为数据类型就需要笨笨的将原代码在改写一下,在现代高级语言中,这显然就比较机械了。

375e1134-b4c9-11eb-bf61-12bb97331649.png

C++中有没有可能将不同成员数据类型但是其顶层逻辑相同的对象,设计为一个类呢?就比如:

376f7c4e-b4c9-11eb-bf61-12bb97331649.png

C++模板编程正是为了解决这样的需求而设计的机制。该机制允许函数或类使用泛型类型(generic type)进行操作。从而,函数或类就可以处理许多不同的数据类型,而无需为每种数据类型重写相应的类或者函数。

怎么实现的呢?

这里又可以大致分这样三种情况:

函数模板(Function templates)

类模板(Class templates)

**成员模板(Member templates) **

函数模板

函数模板其基本语法范式为:

template 《class identifier》 function_declaration; template 《typename identifier》 function_declaration;

template 为模板关键字

《typename identifier》 、《class identifier》 定义函数参数泛型类型或函数体类变量泛型类型

比如:

#include 《iostream》 using namespace std; template 《typename T》 T max(T a, T b) { return a 》 b ? a : b ; }

又或者写成如下形式:

#include 《iostream》 using namespace std; template 《class T》 T max(T a, T b) { return a 》 b ? a : b ; }

那么或许有的朋友会任务关键字class就意味着自定义类,而typename则是基本数据类型,比如int,float等,这样理解其实是不对的,从C++编译器的角度template 《typename T》与template 《class T》其语义是一样的,都是泛型,用户在使用这个模板函数的时候,所传入的参数都既可以是基本数据类型,也可以是类名。

对于上面的代码,或许初使用的朋友还会问,是不是可以随便传入类,这有可能编译不过。为什么呢?你传入的类需要支持》操作符,如果对于某个类你想使用该函数,而本身不支持》操作符,则需要实现》操作符。

类模板

与函数模板类似,类内部成员数据或者函数的参数或变量会使用,模板关键字定义的泛型名。比如:

template 《typename T》 class Point_T { public: Point_T(T x0 = 0, T y0 = 0) :x(x0), y(y0) { } T get_x() const { return x; } T get_y() const { return y; } private: T x; T y; };

这小段代码就回答了之前提出的问题,可以支持不同数据类型的点。

int main() { Point_T《int》 p1(1, 2); Point_T《float》 p2(1.1f, 2.2f); cout 《《 p1.get_x() 《《 endl 《《 p1.get_y() 《《 endl; cout 《《 p2.get_x() 《《 endl 《《 p2.get_y() 《《 endl; }

以上述简单例子看,分别构造了整型点p1,以及浮点型点p2,那么究竟怎么做到的呢?为了理解得更清楚,这里将其关键汇编代码段拷贝下来简要看看:

Point_T《int》 p1(1, 2); 000C1D6C push 2 000C1D6E push 1 000C1D70 lea ecx,[p1] 000C1D73 call Point_T《int》::Point_T《int》 (0C11D1h) Point_T《float》 p2(1.1f, 2.2f); 000C1D78 push ecx 000C1D79 movss xmm0,dword ptr [__real@400ccccd (0C7B34h)] 000C1D81 movss dword ptr [esp],xmm0 000C1D86 push ecx 000C1D87 movss xmm0,dword ptr [__real@3f8ccccd (0C7B30h)] 000C1D8F movss dword ptr [esp],xmm0 000C1D94 lea ecx,[p2] 000C1D97 call Point_T《float》::Point_T《float》 (0C1064h)

可见编译器对不同类型参数实际上做了相应解析,相当于根据用户程序传入的参数编译出相应的多份代码。所以可以简单理解成编译器根据不同泛型实际参数类型生成了相应的处理代码。而前面所说的模板函数其原理也基本类似。

总结一下

通过些简单例子,梳理一下模板函数以及模板类的基本概念以及原理,理解了这两个概念,就比较容易理解成员模板。所谓泛型模板编程,其本质是编译器针对不同参数类型解析解析生成相应的处理代码。学会使用模板泛型编程你会发现你会少写很多代码,代码看起来会比较优雅,而其实操作起来也没有想象中那么难。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3707

    浏览量

    96764
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66837
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76708
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51080

原文标题:什么是函数模板、类模板?怎么做到的?

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用RV-STAR写入模板程序时出错怎么解决?

    我使用的是官方提供的RV-STAR板子,操作系统环境是Windows10。连上板子后也能识别到串口: 下载调试的程序就是模板提供的helloworld,在下载时出现以下错误: 请问是出现了什么问题?要如何解决?谢谢。
    发表于 11-06 06:58

    目标追踪的简易实现:模板匹配

    重新出现在帧图象中时,迅速地重新捕捉到目标。 以上对目标追踪这一领域做了简要的说明,下面将会介绍目标追踪算法中最简单的一种 —— 模板匹配算法。 三、模板匹配算法 模板匹配
    发表于 10-28 07:21

    店铺装修模板同步接口技术解析

    ​  在电商平台开发中,店铺装修模板的跨系统同步是核心需求。本文从接口设计、数据结构和实现逻辑三个维度进行技术拆解。 一、接口设计规范 基础参数 请求方法:POST 端点路径:/api/v1
    的头像 发表于 10-17 15:24 200次阅读
    店铺装修<b class='flag-5'>模板</b>同步接口技术解析

    【RA4M2-SENSOR】1、开箱+新建模板工程

    新建模板工程 3.1 新建工程 之前也有评测过瑞萨开发板,E2S的下载安装教程可参考我之前的文章 。 这里直接新建一个模板工程,为之后的评测项目用。 新建一个Renesas RA项目 项目名称
    发表于 08-31 20:50

    3招告别无效巡检!AI智能巡检让你的门店管理效率翻倍 智睿视界

    智睿视界的巡检系统又升级啦!这次更新后,大家在电脑 Web 端和手机 App 上都能轻松使用三个新功能: ①模板库&AI生成模板: 超多行业模板-模板库中有餐饮、茶饮、烘焙、商超等 7
    的头像 发表于 08-29 17:43 508次阅读
    3招告别无效巡检!AI智能巡检让你的门店管理效率翻倍 智睿视界

    Allegro Skill工艺辅助之导入叠层模板

    在PCB设计中,导入叠层模板能够确保设计的标准化和规范化,避免因手动设置叠层参数而可能出现的错误或不一致情况。
    的头像 发表于 07-10 17:10 2821次阅读
    Allegro Skill工艺辅助之导入叠层<b class='flag-5'>模板</b>

    涂鸦重磅发布萌宠语聊模板!On-App AI降噪+音频处理技术,让远程安抚宠物更安心

    在当前快节奏的生活背景下,宠物常常会因铲屎官的频繁外出、缺乏互动与情感陪伴,而产生孤独抑郁、焦虑、暴躁易怒等问题。为了提升宠物的安全感,涂鸦重磅推出基于On-AppAI构建的萌宠语聊模板,旨在通过
    的头像 发表于 06-05 19:25 707次阅读
    涂鸦重磅发布萌宠语聊<b class='flag-5'>模板</b>!On-App AI降噪+音频处理技术,让远程安抚宠物更安心

    HarmonyOS5云服务技术分享--Serverless抽奖模板部署

    startRaffle) 结束抽奖回调函数(比如endRaffle) 记下函数名,后续配置要用到 3️⃣ ​​工程包准备​​ 下载官方提供的抽奖模板工程包 解压后重点检查portal/dist目录结构 记得
    发表于 05-22 20:25

    基于LockAI视觉识别模块:C++多模板匹配

    模板匹配是一种在图像中同时寻找多个模板的技术。通过对每个模板逐一进行匹配,找到与输入图像最相似的区域,并标记出匹配度最高的结果。本实验提供了一个简单的多模板匹配案例,并将其封装为一个
    发表于 05-14 15:00

    基于LockAI视觉识别模块:C++多模板匹配

    模板匹配是一种在图像中同时寻找多个模板的技术。通过对每个模板逐一进行匹配,找到与输入图像最相似的区域,并标记出匹配度最高的结果。本实验提供了一个简单的多模板匹配案例,并将其封装为一个
    的头像 发表于 05-14 14:37 1335次阅读
    基于LockAI视觉识别模块:C++多<b class='flag-5'>模板</b>匹配

    基于LockAI视觉识别模块:C++模板匹配

    模板匹配是一种在图像中寻找特定模式的技术。它通过滑动一个模板图像(较小的图像)在输入图像上进行比较,找到最相似的区域。本实验提供了一个简单的模板匹配案例,并将其封装为一个自定义函数
    发表于 05-13 14:40

    基于LockAI视觉识别模块:C++模板匹配

    模板匹配是一种在图像中寻找特定模式的技术。它通过滑动一个模板图像(较小的图像)在输入图像上进行比较,找到最相似的区域。本实验提供了一个简单的模板匹配案例,并将其封装为一个自定义函数pe
    的头像 发表于 05-13 14:14 540次阅读
    基于LockAI视觉识别模块:C++<b class='flag-5'>模板</b>匹配

    请问SX3实用程序提供的模板只能在开发板上使用吗?

    SX3 实用程序提供的模板只能在开发板上使用吗?
    发表于 05-09 06:47

    STM32CUBEide有没有像KEIL一样可以自己指定函数注释模板的方法?

    最近从keil转到CUBEIDE编程了,现在非常不舒服的一点是函数注释方面。STM32CUBEide有没有像KEIL一样可以自己指定函数注释模板的方法,可以注释函数形参啊、
    发表于 03-11 08:06

    think-cell——使用JSON数据实现自动化(二)

    26.4 远程提供模板 还可以通过远程服务器提供带有 think-cell 图表的模板文件。在这种情况下,键的值是 URL 而不是本地路径,如上面的远程 JSON 示例所示。URL 可以指定为协议
    的头像 发表于 01-03 10:12 632次阅读
    think-cell——使用JSON数据实现自动化(二)