0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

函數(shù)模板與類(lèi)模板的基本概念及實(shí)現(xiàn)原理

FPGA之家 ? 來(lái)源:CSDN博客嵌入式客棧 ? 作者:CSDN博客嵌入式客棧 ? 2022-03-15 11:21 ? 次閱讀
[導(dǎo)讀] 最近使用C++做些編程,把日常遇到的些比較重要的概念總結(jié)分享一下。本文來(lái)分享一下模板類(lèi)的原理,以及為什么需要模板類(lèi),使用時(shí)的基本要點(diǎn)。

為什么需要模板

比如需要設(shè)計(jì)一個(gè)描述點(diǎn)的類(lèi),大致很快可以寫(xiě)成這樣:

classPoint_F
{
public:
/*默認(rèn)傳入參數(shù)為0,0*/
Point_F(floatx0=0,floaty0=0)
:x(x0),y(y0)/*初始化列表*/
{}

/*用const修飾函數(shù),表示函數(shù)不會(huì)修改成員數(shù)據(jù)*/
floatget_x()const{returnx;}
floatget_y()const{returny;}

private:
/*一般會(huì)將數(shù)據(jù)放在私有區(qū),以對(duì)外隱藏*/
floatx;
floaty;
};

可問(wèn)題是,在有的場(chǎng)合這點(diǎn)的坐標(biāo)系有可能不需要浮點(diǎn),比如界面設(shè)計(jì)中點(diǎn)往往是整型表示即可,那此時(shí)就需要再設(shè)計(jì)一個(gè)整型成員類(lèi):

classPoint_I
{
public:
/*默認(rèn)傳入?yún)?shù)為0,0*/
Point_f(intx0=0,inty0=0)
:x(x0),y(y0)/*初始化列表*/
{}

/*用const修飾函數(shù),表示函數(shù)不會(huì)修改成員數(shù)據(jù)*/
intget_x()const{returnx;}
intget_y()const{returny;}

private:
/*一般會(huì)將數(shù)據(jù)放在私有區(qū),以對(duì)外隱藏*/
intx;
inty;
};

可是在應(yīng)用代碼中,往往發(fā)現(xiàn)對(duì)于不同數(shù)據(jù)成員的應(yīng)用操作確實(shí)基本類(lèi)似,而且應(yīng)用代碼往往這兩種(甚至更多成員數(shù)據(jù)類(lèi)型)都可能會(huì)同時(shí)用到,僅僅因?yàn)閿?shù)據(jù)類(lèi)型就需要笨笨的將原代碼在改寫(xiě)一下,在現(xiàn)代高級(jí)語(yǔ)言中,這顯然就比較機(jī)械了。

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

C++中有沒(méi)有可能將不同成員數(shù)據(jù)類(lèi)型但是其頂層邏輯相同的對(duì)象,設(shè)計(jì)為一個(gè)類(lèi)呢?就比如:

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

C++模板編程正是為了解決這樣的需求而設(shè)計(jì)的機(jī)制。該機(jī)制允許函數(shù)或類(lèi)使用泛型類(lèi)型(generic type)進(jìn)行操作。從而,函數(shù)或類(lèi)就可以處理許多不同的數(shù)據(jù)類(lèi)型,而無(wú)需為每種數(shù)據(jù)類(lèi)型重寫(xiě)相應(yīng)的類(lèi)或者函數(shù)。

怎么實(shí)現(xiàn)的呢?

這里又可以大致分這樣三種情況:

  • 函數(shù)模板(Function templates)
  • 類(lèi)模板(Class templates)
  • **成員模板(Member templates) **

函數(shù)模板

函數(shù)模板其基本語(yǔ)法范式為:

template<classidentifier>function_declaration;
template<typenameidentifier>function_declaration;
  • template 為模板關(guān)鍵字
  • 、 定義函數(shù)參數(shù)泛型類(lèi)型或函數(shù)體類(lèi)變量泛型類(lèi)型

比如:

#include
usingnamespacestd;

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

又或者寫(xiě)成如下形式:

#include
usingnamespacestd;

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

那么或許有的朋友會(huì)任務(wù)關(guān)鍵字class就意味著自定義類(lèi),而typename則是基本數(shù)據(jù)類(lèi)型,比如int,float等,這樣理解其實(shí)是不對(duì)的,從C++編譯器的角度template 與template 其語(yǔ)義是一樣的,都是泛型,用戶(hù)在使用這個(gè)模板函數(shù)的時(shí)候,所傳入的參數(shù)都既可以是基本數(shù)據(jù)類(lèi)型,也可以是類(lèi)名。

對(duì)于上面的代碼,或許初使用的朋友還會(huì)問(wèn),是不是可以隨便傳入類(lèi),這有可能編譯不過(guò)。為什么呢?你傳入的類(lèi)需要支持>操作符,如果對(duì)于某個(gè)類(lèi)你想使用該函數(shù),而本身不支持>操作符,則需要實(shí)現(xiàn)>操作符。

類(lèi)模板

與函數(shù)模板類(lèi)似,類(lèi)內(nèi)部成員數(shù)據(jù)或者函數(shù)的參數(shù)或變量會(huì)使用,模板關(guān)鍵字定義的泛型名。比如:

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;
};

這小段代碼就回答了之前提出的問(wèn)題,可以支持不同數(shù)據(jù)類(lèi)型的點(diǎn)。

intmain()
{
Point_T<int>p1(1,2);
Point_T<float>p2(1.1f,2.2f);
cout<endl<endl;
cout<endl<endl;
}

以上述簡(jiǎn)單例子看,分別構(gòu)造了整型點(diǎn)p1,以及浮點(diǎn)型點(diǎn)p2,那么究竟怎么做到的呢?為了理解得更清楚,這里將其關(guān)鍵匯編代碼段拷貝下來(lái)簡(jiǎn)要看看:

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)

可見(jiàn)編譯器對(duì)不同類(lèi)型參數(shù)實(shí)際上做了相應(yīng)解析,相當(dāng)于根據(jù)用戶(hù)程序傳入的參數(shù)編譯出相應(yīng)的多份代碼。所以可以簡(jiǎn)單理解成編譯器根據(jù)不同泛型實(shí)際參數(shù)類(lèi)型生成了相應(yīng)的處理代碼。而前面所說(shuō)的模板函數(shù)其原理也基本類(lèi)似。

總結(jié)一下

通過(guò)些簡(jiǎn)單例子,梳理一下模板函數(shù)以及模板類(lèi)的基本概念以及原理,理解了這兩個(gè)概念,就比較容易理解成員模板。所謂泛型模板編程,其本質(zhì)是編譯器針對(duì)不同參數(shù)類(lèi)型解析解析生成相應(yīng)的處理代碼。學(xué)會(huì)使用模板泛型編程你會(huì)發(fā)現(xiàn)你會(huì)少寫(xiě)很多代碼,代碼看起來(lái)會(huì)比較優(yōu)雅,而其實(shí)操作起來(lái)也沒(méi)有想象中那么難。

原文標(biāo)題:什么是函數(shù)模板、類(lèi)模板?怎么做到的?

文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3521

    瀏覽量

    93263
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965
  • 原理
    +關(guān)注

    關(guān)注

    4

    文章

    550

    瀏覽量

    44811

原文標(biāo)題:什么是函數(shù)模板、類(lèi)模板?怎么做到的?

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    為什么我的labview函數(shù)模板里沒(méi)有file I/O子模板?

    為什么我的labview函數(shù)模板里沒(méi)有file I/O子模板?
    發(fā)表于 10-30 17:26

    ActiveX函數(shù)模板的基本使 用

    出現(xiàn)最小化后的Excel圖標(biāo),執(zhí)行預(yù)先定義的宏后自動(dòng)退出Excel, 從而有效地避免了報(bào)告生成過(guò)程中用戶(hù)的誤操作。這里僅介紹了ActiveX函數(shù)模板的基本使用,以及調(diào)用Excel過(guò)程的總體框架,用戶(hù)可以根據(jù)實(shí)際需要進(jìn)行擴(kuò)充從而構(gòu)建出自己的函 數(shù)庫(kù)。
    發(fā)表于 01-26 22:47

    USB基本概念及從機(jī)編程方法介紹

    慕課蘇州大學(xué).嵌入式開(kāi)發(fā)及應(yīng)用.第四章.較復(fù)雜通信模塊.USB基本概念及從機(jī)編程方法0 目錄4 較復(fù)雜通信模塊4.4 USB基本概念及從機(jī)編程方法4.4.1 課堂重點(diǎn)4.4.2 測(cè)試與作業(yè)5 下一
    發(fā)表于 11-08 09:14

    如何創(chuàng)建庫(kù)函數(shù)模板

    如何創(chuàng)建庫(kù)函數(shù)模板?STM32固件庫(kù)是什么?
    發(fā)表于 12-01 07:38

    單片機(jī)常用函數(shù)模板

    單片機(jī)常用函數(shù)模板以及在KEIL的Templates中添加自己的注釋模板 keil通用51單片機(jī)32單片機(jī)keil添加keil通用switch (){case 0: break;case 1
    發(fā)表于 01-05 07:59

    介紹一下IAR的文件模板函數(shù)模板

    IAR的文件模板是怎樣的?IAR的函數(shù)注釋模板是怎樣的?
    發(fā)表于 01-27 07:17

    SPI回調(diào)函數(shù)模板錯(cuò)誤?

    我想我找到了另一個(gè)“WTF?”:對(duì)于SPI驅(qū)動(dòng),Peripherals Tool提供了一個(gè)回調(diào)函數(shù)模板:選擇一個(gè) Flexcomm 實(shí)例并單擊“復(fù)制到剪貼板”。這就是你會(huì)得
    發(fā)表于 03-15 08:15

    轉(zhuǎn)載一篇MSP430中斷c語(yǔ)言函數(shù)模板

    轉(zhuǎn)載一篇MSP430中斷c語(yǔ)言函數(shù)模板包括了基本模塊的所有中斷模板,感興趣的小伙伴們可以看看。
    發(fā)表于 07-26 11:11 ?3次下載

    基于RF射頻知識(shí)基本概念及DTD無(wú)線產(chǎn)品介紹

    基于RF射頻知識(shí)基本概念及DTD無(wú)線產(chǎn)品介紹
    發(fā)表于 10-25 08:38 ?8次下載
    基于RF射頻知識(shí)<b class='flag-5'>基本概念及</b>DTD無(wú)線產(chǎn)品介紹

    Vision控件和函數(shù)模板及圖像處理步驟的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Vision控件和函數(shù)模板及圖像處理步驟的詳細(xì)資料說(shuō)明。Vision 控件模板 Vision 控件模板位于 LabVIEW 控件模板的最頂層,由一下元素組
    發(fā)表于 05-29 08:00 ?14次下載
    Vision控件和<b class='flag-5'>函數(shù)模板</b>及圖像處理步驟的詳細(xì)資料說(shuō)明

    C++之類(lèi)模板深入學(xué)習(xí)的總結(jié)

    類(lèi)模板可以定義任意多個(gè)不同的類(lèi)型參數(shù);類(lèi)模板可以被部分特化和完全特化;特化的本質(zhì)是模板的分開(kāi)實(shí)現(xiàn)
    的頭像 發(fā)表于 12-24 15:46 ?486次閱讀

    C++之函數(shù)模板概念及意義

    一、函數(shù)模板的引出:1、c++中有幾種交換變量的方法:(1)定義宏代碼塊(2)定義函數(shù)代碼版本一:#include <iostream>#include <string>using namespace
    的頭像 發(fā)表于 12-24 15:58 ?775次閱讀

    C++中為什么需要函數(shù)模板、類(lèi)模板

    [導(dǎo)讀] 最近使用C++做些編程,把日常遇到的些比較重要的概念總結(jié)分享一下。本文來(lái)分享一下模板類(lèi)的原理,以及為什么需要模板類(lèi),使用時(shí)的基本要
    的頭像 發(fā)表于 03-12 14:31 ?3059次閱讀

    你們知道什么是函數(shù)模板類(lèi)模板?

    [導(dǎo)讀] 最近使用C++做些編程,把日常遇到的些比較重要的概念總結(jié)分享一下。本文來(lái)分享一下模板類(lèi)的原理,以及為什么需要模板類(lèi),使用時(shí)的基本要
    的頭像 發(fā)表于 05-17 15:29 ?1965次閱讀
    你們知道什么是<b class='flag-5'>函數(shù)模板</b>、<b class='flag-5'>類(lèi)</b><b class='flag-5'>模板</b>?

    模板函數(shù)以及模板類(lèi)基本概念以及原理

    最近使用C++做些編程,把日常遇到的些比較重要的概念總結(jié)分享一下。本文來(lái)分享一下模板類(lèi)的原理,以及為什么需要模板類(lèi),使用時(shí)的基本要點(diǎn)。
    的頭像 發(fā)表于 07-11 10:42 ?1165次閱讀