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

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

3天内不再提示

模板函数以及模板类的基本概念以及原理

FPGA之家 来源:嵌入式客栈 作者:嵌入式客栈 2022-07-11 10:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

为什么需要模板

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

classPoint_F
{
public:
/*默认传入参数为0,0*/
Point_F(floatx0=0,floaty0=0)
:x(x0),y(y0)/*初始化列表*/
{}

/*用const修饰函数,表示函数不会修改成员数据*/
floatget_x()const{returnx;}
floatget_y()const{returny;}

private:
/*一般会将数据放在私有区,以对外隐藏*/
floatx;
floaty;
};

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

classPoint_I
{
public:
/*默认传入参数为0,0*/
Point_f(intx0=0,inty0=0)
:x(x0),y(y0)/*初始化列表*/
{}

/*用const修饰函数,表示函数不会修改成员数据*/
intget_x()const{returnx;}
intget_y()const{returny;}

private:
/*一般会将数据放在私有区,以对外隐藏*/
intx;
inty;
};

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

e1d348ce-00c1-11ed-ba43-dac502259ad0.png

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

e1e03fb6-00c1-11ed-ba43-dac502259ad0.png

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

怎么实现的呢?

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

函数模板(Function templates)

类模板(Class templates)

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

函数模板

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

templatefunction_declaration;
templatefunction_declaration;

template 为模板关键字

定义函数参数泛型类型或函数体类变量泛型类型

比如:

#include
usingnamespacestd;

template
Tmax(Ta,Tb)
{
returna>b?a:b;
}

又或者写成如下形式:

#include
usingnamespacestd;

template
Tmax(Ta,Tb)
{
returna>b?a:b;
}

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

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

类模板

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

template
classPoint_T
{
public:
Point_T(Tx0=0,Ty0=0)
:x(x0),y(y0)
{}
Tget_x()const{returnx;}
Tget_y()const{returny;}

private:
Tx;
Ty;
};

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

intmain()
{
Point_Tp1(1,2);
Point_Tp2(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   p1(1, 2);
000C1D6C  push        2  
000C1D6E  push        1  
000C1D70  lea         ecx,[p1]  
000C1D73  call        Point_T::Point_T (0C11D1h)  
Point_T 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::Point_T (0C1064h)

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

总结一下

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

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

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

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

    关注

    3

    文章

    4423

    浏览量

    68048
  • C++
    C++
    +关注

    关注

    22

    文章

    2131

    浏览量

    77496
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74546
  • 编译器
    +关注

    关注

    1

    文章

    1673

    浏览量

    52080

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    开关电源的基本概念和分析方法

    开关电源的基本概念和分析方法
    发表于 04-10 15:20 1次下载

    瑞萨RA MCU众测宝典 | 环境搭建之【RA-Eco-RA4M2】基本模板搭建与LED

    瑞萨“RAMCU众测宝典”环境搭建专题再添硬核实操!这次将解锁“基本模板搭建与LED”技能,加入简易调度器实现多任务管理,一步步搞定“能直接落地”的开发模板,不管是入门练手还是项目开发都能复用。开启
    的头像 发表于 03-27 17:30 2576次阅读
    瑞萨RA MCU众测宝典 | 环境搭建之【RA-Eco-RA4M2】基本<b class='flag-5'>模板</b>搭建与LED

    Helm包管理与模板化部署实战

    直接用kubectl管理K8s资源,10个微服务就要维护几十个YAML文件,版本管理靠文件夹命名,回滚靠手动替换文件。Helm把一组相关的K8s资源打包成Chart,支持模板化、版本管理、一键部署和回滚,是K8s生态中事实上的包管理标准。
    的头像 发表于 02-26 16:37 509次阅读

    瑞萨RA-Eco-RA4M2开发板基本模板搭建与LED指南

    瑞萨“RA MCU众测宝典”环境搭建专题再添硬核实操!这次将解锁“基本模板搭建与LED”技能,加入简易调度器实现多任务管理,一步步搞定“能直接落地”的开发模板,不管是入门练手还是项目开发都能复用。
    的头像 发表于 02-24 14:43 7486次阅读
    瑞萨RA-Eco-RA4M2开发板基本<b class='flag-5'>模板</b>搭建与LED指南

    【Moldex3D丨技巧分享】__ 压缩制程模温分析支援模板移动

    纳入模拟分析中,使模拟更贴近于实际状况,将可以得到更准确的模内温度预测。以下将说明如何在Moldex3D压缩制程模拟中纳入模板移动行为以及其影响。part01操作流
    的头像 发表于 01-14 16:25 679次阅读
    【Moldex3D丨技巧分享】__ 压缩制程模温分析支援<b class='flag-5'>模板</b>移动

    京东关键词 API 场景的需求梳理模板

    京东关键词 API 场景需求梳理模板模板适用于 联盟推广、商家运营、工具开发、市场分析 等基于京东关键词 API 的业务需求梳理,可直接用于需求文档撰写、API 对接方案评审。 核心模块 填写项
    的头像 发表于 01-08 13:45 343次阅读

    CW32F030开发板的工程模板

    温湿度实验 EX9AD电位器实验 其中 Libraries是CW32官方的库函数文件,类似STM32的标准库或者HAL库,非常重要的东西。 CW32-48F大学计划板源码工程文件结构 在官方提供
    发表于 12-26 08:08

    C语言和C++之间的区别是什么

    区别 1、面向对象编程 (OOP): C语言是一种面向过程的语言,它强调的是通过函数将任务分解为一系列步骤进行执行。 C++在C语言的基础上扩展了面向对象的特性,支持(class)、封装、继承
    发表于 12-11 06:23

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

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

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

    一、目标追踪和图像识别 一般来说,提到机器视觉这个概念都会想到图像识别,比如人脸识别、文本识别等等,目标追踪这个概念在平时接触的相对比较少。但实际上,目标追踪可以理解为图像识别的动态过程:图像识别
    发表于 10-28 07:21

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

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

    电压波动与闪变的基本概念

    如果您是电力系统工程师、电气设备维护人员或者相关专业的学生,应该注意到了有关电能质量的国家标准GB/T 12326-2008是有关电压波动和闪变的,那这两个参数的考核意义是什么?国家标准规定这两个参数如何计算、测量和考核?这篇文章带您全面了解电压波动和闪变的基本概念、重要性以及
    的头像 发表于 07-22 14:10 3608次阅读
    电压波动与闪变的<b class='flag-5'>基本概念</b>

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

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

    隔离屏障的概念以及工作电压和测试电压之间的区别

    电源中的电气隔离不仅仅是关乎安全——它更是性能和可靠性的基石。本文将探讨隔离屏障的概念以及工作电压和测试电压之间的区别。它还将讨论标准为何重要?帮助工程师设计出满足当今严苛法规和应用需求的稳健系统。
    的头像 发表于 07-08 15:29 1144次阅读

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

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