女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

FPGA之家 ? 來源:嵌入式客棧 ? 作者:嵌入式客棧 ? 2021-03-12 14:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

[導(dǎo)讀] 最近使用C++做些編程,把日常遇到的些比較重要的概念總結(jié)分享一下。本文來分享一下模板類的原理,以及為什么需要模板類,使用時(shí)的基本要點(diǎn)。

為什么需要模板

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

class Point_F { public: /*默認(rèn)傳入?yún)?shù)為0,0*/ Point_F(float x0 = 0, float y0 = 0) :x(x0), y(y0) /*初始化列表*/ { } /*用const修飾函數(shù),表示函數(shù)不會(huì)修改成員數(shù)據(jù)*/ float get_x() const { return x; } float get_y() const { return y; } private: /*一般會(huì)將數(shù)據(jù)放在私有區(qū),以對(duì)外隱藏*/ float x; float y; };

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

class Point_I { public: /*默認(rèn)傳入?yún)?shù)為0,0*/ Point_f(int x0 = 0, int y0 = 0) :x(x0), y(y0) /*初始化列表*/ { } /*用const修飾函數(shù),表示函數(shù)不會(huì)修改成員數(shù)據(jù)*/ int get_x() const { return x; } int get_y() const { return y; } private: /*一般會(huì)將數(shù)據(jù)放在私有區(qū),以對(duì)外隱藏*/ int x; int y; };

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

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

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

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

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

函數(shù)模板(Function templates)

類模板(Class templates)

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

函數(shù)模板

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

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

template 為模板關(guān)鍵字

《typename identifier》 、《class identifier》 定義函數(shù)參數(shù)泛型類型或函數(shù)體類變量泛型類型

比如:

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

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

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

類模板

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

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

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

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

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

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)

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

總結(jié)一下

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95247
  • 模板
    +關(guān)注

    關(guān)注

    0

    文章

    109

    瀏覽量

    20871
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75303

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HarmonyOS5云服務(wù)技術(shù)分享--Serverless抽獎(jiǎng)模板部署

    startRaffle) 結(jié)束抽獎(jiǎng)回調(diào)函數(shù)(比如endRaffle) 記下函數(shù)名,后續(xù)配置要用到 3?? ??工程包準(zhǔn)備?? 下載官方提供的抽獎(jiǎng)模板工程包 解壓后重點(diǎn)檢查portal/dist目錄結(jié)構(gòu) 記得
    發(fā)表于 05-22 20:25

    基于LockAI視覺識(shí)別模塊:C++模板匹配

    模板匹配是一種在圖像同時(shí)尋找多個(gè)模板的技術(shù)。通過對(duì)每個(gè)模板逐一進(jìn)行匹配,找到與輸入圖像最相似的區(qū)域,并標(biāo)記出匹配度最高的結(jié)果。本實(shí)驗(yàn)提供了一個(gè)簡單的多
    發(fā)表于 05-14 15:00

    基于LockAI視覺識(shí)別模塊:C++模板匹配

    模板匹配是一種在圖像同時(shí)尋找多個(gè)模板的技術(shù)。通過對(duì)每個(gè)模板逐一進(jìn)行匹配,找到與輸入圖像最相似的區(qū)域,并標(biāo)記出匹配度最高的結(jié)果。本實(shí)驗(yàn)提供了一個(gè)簡單的多
    的頭像 發(fā)表于 05-14 14:37 ?316次閱讀
    基于LockAI視覺識(shí)別模塊:<b class='flag-5'>C++</b>多<b class='flag-5'>模板</b>匹配

    基于LockAI視覺識(shí)別模塊:C++模板匹配

    模板匹配是一種在圖像尋找特定模式的技術(shù)。它通過滑動(dòng)一個(gè)模板圖像(較小的圖像)在輸入圖像上進(jìn)行比較,找到最相似的區(qū)域。本實(shí)驗(yàn)提供了一個(gè)簡單的模板匹配案例,并將其封裝為一個(gè)自定義
    發(fā)表于 05-13 14:40

    基于LockAI視覺識(shí)別模塊:C++模板匹配

    模板匹配是一種在圖像尋找特定模式的技術(shù)。它通過滑動(dòng)一個(gè)模板圖像(較小的圖像)在輸入圖像上進(jìn)行比較,找到最相似的區(qū)域。本實(shí)驗(yàn)提供了一個(gè)簡單的模板匹配案例,并將其封裝為一個(gè)自定義
    的頭像 發(fā)表于 05-13 14:14 ?202次閱讀
    基于LockAI視覺識(shí)別模塊:<b class='flag-5'>C++</b><b class='flag-5'>模板</b>匹配

    C++學(xué)到什么程度可以找工作?

    C++學(xué)到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開發(fā)人員或相關(guān)職位,通常需要掌握以下幾個(gè)方面: 1. **語言基礎(chǔ)**:你需要對(duì)C
    發(fā)表于 03-13 10:19

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序。Spire.XLS for C+
    的頭像 發(fā)表于 01-14 09:40 ?623次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    EE-112:模擬C++實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《EE-112:模擬C++實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 01-03 15:15 ?0次下載
    EE-112:模擬<b class='flag-5'>C++</b><b class='flag-5'>中</b>的<b class='flag-5'>類</b>實(shí)現(xiàn)

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個(gè)返回值。 C語言的函數(shù)可以不寫返回值類型,編譯器會(huì)默認(rèn)為返回 int。 但是
    的頭像 發(fā)表于 11-29 10:25 ?909次閱讀

    圖紙模板的文本變量

    “ ?文本變量和系統(tǒng)自帶的內(nèi)置變量,可以幫助工程師靈活、高效地配置標(biāo)題欄的信息,而不用擔(dān)心模板的文字對(duì)象被意外修改。 ? ” 文本變量的語法 文本變量以?${VARIABLENAME}?的方式
    的頭像 發(fā)表于 11-13 18:21 ?654次閱讀
    圖紙<b class='flag-5'>模板</b><b class='flag-5'>中</b>的文本變量

    A0到A4的圖框只要一個(gè)圖紙模板就搞定了?

    非常靈活的管理方式,只需要一個(gè)圖紙模板就可以搞定不同尺寸的場(chǎng)景。 ? ” 圖紙模板的組成 圖紙模板是由以下基本對(duì)象組成的: 直線 矩形 文本(包括普通字符串以及文本變量,或者系統(tǒng)自帶的
    的頭像 發(fā)表于 11-13 18:13 ?1560次閱讀
    A0到A4的圖框只要一個(gè)圖紙<b class='flag-5'>模板</b>就搞定了?

    摩爾線程開源高性能線性代數(shù)模板庫MUTLASS

    近日,摩爾線程宣布開源高性能線性代數(shù)模板庫MUTLASS,以便開發(fā)者能夠更高效針對(duì)摩爾線程全功能GPU的MUSA Core及Tensor Core等單元進(jìn)行編程,加速基于國產(chǎn)GPU的算子開發(fā)以及算法創(chuàng)新。
    的頭像 發(fā)表于 11-13 11:53 ?782次閱讀

    手寫圖像模板匹配算法在OpenCV的實(shí)現(xiàn)

    OpenCV模板匹配是支持基于NCC相似度查找的,但是不是很好用,一個(gè)主要的原因是查找最大閾值,只能匹配一個(gè),自己比對(duì)閾值,又導(dǎo)致無法正確設(shè)定閾值范圍,所以問題很多。于是我重新寫了純Python版本的NCC圖像模板匹配的代碼
    的頭像 發(fā)表于 11-11 10:12 ?767次閱讀
    手寫圖像<b class='flag-5'>模板</b>匹配算法在OpenCV<b class='flag-5'>中</b>的實(shí)現(xiàn)

    使用C語言實(shí)現(xiàn)函數(shù)模板

      用C語言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?947次閱讀

    C++實(shí)現(xiàn)類似instanceof的方法

    函數(shù),可實(shí)際上C++沒有。但是別著急,其實(shí)C++中有兩種簡單的方法可以實(shí)現(xiàn)類似Java的instanceof的功能。 在
    的頭像 發(fā)表于 07-18 10:16 ?945次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實(shí)現(xiàn)類似instanceof的方法