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

完善資料讓更多小伙伴認識你,還能領取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:
/*一般會將數據放在私有區(qū),以對外隱藏*/
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:
/*一般會將數據放在私有區(qū),以對外隱藏*/
intx;
inty;
};

可是在應用代碼中,往往發(fā)現對于不同數據成員的應用操作確實基本類似,而且應用代碼往往這兩種(甚至更多成員數據類型)都可能會同時用到,僅僅因為數據類型就需要笨笨的將原代碼在改寫一下,在現代高級語言中,這顯然就比較機械了。

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,以及浮點型點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)

可見編譯器對不同類型參數實際上做了相應解析,相當于根據用戶程序傳入的參數編譯出相應的多份代碼。所以可以簡單理解成編譯器根據不同泛型實際參數類型生成了相應的處理代碼。而前面所說的模板函數其原理也基本類似。

總結一下

通過些簡單例子,梳理一下模板函數以及模板類的基本概念以及原理,理解了這兩個概念,就比較容易理解成員模板。所謂泛型模板編程,其本質是編譯器針對不同參數類型解析解析生成相應的處理代碼。學會使用模板泛型編程你會發(fā)現你會少寫很多代碼,代碼看起來會比較優(yōu)雅,而其實操作起來也沒有想象中那么難。

原文標題:什么是函數模板、類模板?怎么做到的?

文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4235

    瀏覽量

    61965
  • C++
    C++
    +關注

    關注

    21

    文章

    2085

    瀏覽量

    73301
  • 代碼
    +關注

    關注

    30

    文章

    4670

    瀏覽量

    67764
  • 編譯器
    +關注

    關注

    1

    文章

    1602

    瀏覽量

    48895

原文標題:什么是函數模板、類模板?怎么做到的?

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    卷積神經網絡的基本概念和工作原理

    和工作原理,在處理圖像數據時展現出了卓越的性能。本文將從卷積神經網絡的基本概念、結構組成、工作原理以及實際應用等多個方面進行深入解讀。
    的頭像 發(fā)表于 07-02 18:17 ?1290次閱讀

    串口通信的基本概念

    串口通信(Serial Communications)的基本概念可以歸納為以下幾個方面:
    的頭像 發(fā)表于 06-12 09:28 ?380次閱讀
    串口通信的<b class='flag-5'>基本概念</b>

    CW32F003E4芯片入門學習:4.工程模板創(chuàng)建(使用例程或模板)

    模板路徑:CW32F003_StandardPeripheralLib_V1.4ExamplesTemplate
    的頭像 發(fā)表于 04-24 14:14 ?288次閱讀
    CW32F003E4芯片入門學習:4.工程<b class='flag-5'>模板</b>創(chuàng)建(使用例程或<b class='flag-5'>模板</b>)

    Altium Designer與Gerber模板的導入指南

    我們在設計完成后,準備輸出Gerber的時候,有時候想用自己的Gerber模板導入PCB進行編輯,那么是如何設置導入的呢?
    的頭像 發(fā)表于 03-28 09:41 ?944次閱讀
    Altium Designer與Gerber<b class='flag-5'>模板</b>的導入指南

    使用Jenkins和單個模板部署多個Kubernetes組件

    YAML模板文件(.tpl)來部署多個類似的Kubernetes組件,而不需要為每個組件提供單獨的模板文件。
    的頭像 發(fā)表于 01-02 11:40 ?552次閱讀
    使用Jenkins和單個<b class='flag-5'>模板</b>部署多個Kubernetes組件

    如何使用CMW500測試頻譜模板

    在使用CMW500測試頻譜模板之前,首先我們需要了解什么是頻譜模板以及其在通信系統(tǒng)測試中的作用。頻譜模板是指在特定的頻率范圍內,記錄了該頻率范圍內的信號功率譜密度的一種圖形表示。在通信
    的頭像 發(fā)表于 12-25 15:10 ?1117次閱讀

    函數指針的基本概念和語法

    函數指針是一種非常強大的編程工具,它可以讓我們以更加靈活的方式編寫程序。在本文中,我們將介紹 8 個函數指針的高級應用場景,并貼出相應的代碼案例和解釋。
    的頭像 發(fā)表于 12-12 09:33 ?372次閱讀

    OpenCV邊緣模板匹配算法原理詳解

    OpenCV中自帶的模板匹配算法,完全是像素基本的模板匹配,特別容易受到光照影響,光照稍微有所不同,該方法就會歇菜了!搞得很多OpenCV初學者剛學習到該方法時候很開心,一用該方法馬上很傷心
    的頭像 發(fā)表于 12-07 10:56 ?1103次閱讀
    OpenCV邊緣<b class='flag-5'>模板</b>匹配算法原理詳解

    接地裝置的基本概念

    接地裝置的基本概念
    的頭像 發(fā)表于 12-05 15:49 ?452次閱讀
    接地裝置的<b class='flag-5'>基本概念</b>

    中斷函數基本概念

    單片機:中斷函數
    的頭像 發(fā)表于 12-05 09:08 ?480次閱讀
    中斷<b class='flag-5'>函數</b>的<b class='flag-5'>基本概念</b>

    模板匹配算法的改進及在自動發(fā)牌機中的應用

    電子發(fā)燒友網站提供《模板匹配算法的改進及在自動發(fā)牌機中的應用.pdf》資料免費下載
    發(fā)表于 11-08 09:53 ?0次下載
    <b class='flag-5'>模板</b>匹配算法的改進及在自動發(fā)牌機中的應用

    SMT模板(鋼網)的概述及特點

    模板的采購不僅是裝配工藝的步,它也是重要的一步。模板的主要功能是幫助錫膏的沉積(deposition)。目的是將準確數量的材料轉移到光板(bare PCB)上準確的位置。錫膏阻塞在模板上越少,沉積在電路板上就越多。
    發(fā)表于 10-12 15:12 ?649次閱讀

    openCV的庫自帶了模板匹配算法嗎?

    openCV的庫自帶了模板匹配算法嗎
    發(fā)表于 10-10 06:48

    如何通過模板模式重構代碼

    法的某些特定步驟。 說人話:父模板方法定義不變的流程,子類重寫流程中的方法。 2、模板模式定義 ①、AbstractClass 抽象
    的頭像 發(fā)表于 10-08 16:15 ?362次閱讀
    如何通過<b class='flag-5'>模板</b>模式重構代碼

    天線的幾個基本概念

    電子發(fā)燒友網站提供《天線的幾個基本概念.ppt》資料免費下載
    發(fā)表于 10-07 16:17 ?1次下載
    天線的幾個<b class='flag-5'>基本概念</b>