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

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

3天内不再提示

函数模板与类模板的基本概念及实现原理

FPGA之家 来源:CSDN博客嵌入式客栈 作者:CSDN博客嵌入式客栈 2022-03-15 11:21 次阅读
[导读] 最近使用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;
};

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

318025dc-8d80-11ec-952b-dac502259ad0.png

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

319ca86a-8d80-11ec-952b-dac502259ad0.png

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

怎么实现的呢?

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

  • 函数模板(Function templates)
  • 类模板(Class templates)
  • **成员模板(Member templates) **

函数模板

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

template<classidentifier>function_declaration;
template<typenameidentifier>function_declaration;
  • template 为模板关键字
  • 、 定义函数参数泛型类型或函数体类变量泛型类型

比如:

#include
usingnamespacestd;

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

又或者写成如下形式:

#include
usingnamespacestd;

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

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

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

类模板

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

template<typenameT>
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_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   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之家】欢迎添加关注!文章转载请注明出处。

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

    关注

    88

    文章

    3587

    浏览量

    93577
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62409
  • 原理
    +关注

    关注

    4

    文章

    550

    浏览量

    44865

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

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

收藏 人收藏

    评论

    相关推荐

    为什么我的labview函数模板里没有file I/O子模板?

    为什么我的labview函数模板里没有file I/O子模板?
    发表于 10-30 17:26

    ActiveX函数模板的基本使 用

    出现最小化后的Excel图标,执行预先定义的宏后自动退出Excel, 从而有效地避免了报告生成过程中用户的误操作。这里仅介绍了ActiveX函数模板的基本使用,以及调用Excel过程的总体框架,用户可以根据实际需要进行扩充从而构建出自己的函 数库。
    发表于 01-26 22:47

    USB基本概念及从机编程方法介绍

    慕课苏州大学.嵌入式开发及应用.第四章.较复杂通信模块.USB基本概念及从机编程方法0 目录4 较复杂通信模块4.4 USB基本概念及从机编程方法4.4.1 课堂重点4.4.2 测试与作业5 下一
    发表于 11-08 09:14

    如何创建库函数模板

    如何创建库函数模板?STM32固件库是什么?
    发表于 12-01 07:38

    单片机常用函数模板

    单片机常用函数模板以及在KEIL的Templates中添加自己的注释模板 keil通用51单片机32单片机keil添加keil通用switch (){case 0: break;case 1
    发表于 01-05 07:59

    介绍一下IAR的文件模板函数模板

    IAR的文件模板是怎样的?IAR的函数注释模板是怎样的?
    发表于 01-27 07:17

    SPI回调函数模板错误?

    我想我找到了另一个“WTF?”:对于SPI驱动,Peripherals Tool提供了一个回调函数模板:选择一个 Flexcomm 实例并单击“复制到剪贴板”。这就是你会得
    发表于 03-15 08:15

    转载一篇MSP430中断c语言函数模板

    转载一篇MSP430中断c语言函数模板包括了基本模块的所有中断模板,感兴趣的小伙伴们可以看看。
    发表于 07-26 11:11 3次下载

    基于RF射频知识基本概念及DTD无线产品介绍

    基于RF射频知识基本概念及DTD无线产品介绍
    发表于 10-25 08:38 8次下载
    基于RF射频知识<b class='flag-5'>基本概念及</b>DTD无线产品介绍

    Vision控件和函数模板及图像处理步骤的详细资料说明

    本文档的主要内容详细介绍的是Vision控件和函数模板及图像处理步骤的详细资料说明。Vision 控件模板 Vision 控件模板位于 LabVIEW 控件模板的最顶层,由一下元素组
    发表于 05-29 08:00 14次下载
    Vision控件和<b class='flag-5'>函数模板</b>及图像处理步骤的详细资料说明

    C++之类模板深入学习的总结

    模板可以定义任意多个不同的类型参数;模板可以被部分特化和完全特化;特化的本质是模板的分开实现
    的头像 发表于 12-24 15:46 531次阅读

    C++之函数模板概念及意义

    一、函数模板的引出:1、c++中有几种交换变量的方法:(1)定义宏代码块(2)定义函数代码版本一:#include <iostream>#include <string>using namespace
    的头像 发表于 12-24 15:58 833次阅读

    C++中为什么需要函数模板模板

    [导读] 最近使用C++做些编程,把日常遇到的些比较重要的概念总结分享一下。本文来分享一下模板的原理,以及为什么需要模板,使用时的基本要
    的头像 发表于 03-12 14:31 3108次阅读

    你们知道什么是函数模板模板

    [导读] 最近使用C++做些编程,把日常遇到的些比较重要的概念总结分享一下。本文来分享一下模板的原理,以及为什么需要模板,使用时的基本要
    的头像 发表于 05-17 15:29 2091次阅读
    你们知道什么是<b class='flag-5'>函数模板</b>、<b class='flag-5'>类</b><b class='flag-5'>模板</b>?

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

    最近使用C++做些编程,把日常遇到的些比较重要的概念总结分享一下。本文来分享一下模板的原理,以及为什么需要模板,使用时的基本要点。
    的头像 发表于 07-11 10:42 1259次阅读