在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

FPGA之家 ? 來源:嵌入式客棧 ? 作者:嵌入式客棧 ? 2021-05-17 15:29 ? 次閱讀

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

為什么需要模板

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

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

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

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ù)不會修改成員數(shù)據(jù)*/ int get_x() const { return x; } int get_y() const { return y; } private: /*一般會將數(shù)據(jù)放在私有區(qū),以對外隱藏*/ int x; int y; };

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

375e1134-b4c9-11eb-bf61-12bb97331649.png

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

376f7c4e-b4c9-11eb-bf61-12bb97331649.png

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

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

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

類模板

與函數(shù)模板類似,類內(nèi)部成員數(shù)據(jù)或者函數(shù)的參數(shù)或變量會使用,模板關(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)

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

總結(jié)一下

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

編輯:jq

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

    關(guān)注

    88

    文章

    3637

    瀏覽量

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

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

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73859
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1642

    瀏覽量

    49291

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    如何用VSCODE創(chuàng)建一個LE5010的工程模板

    我想問下,就是怎么用vscode來創(chuàng)建LE5010的工程模板,我看網(wǎng)上的資料很少很少,官方給的SDK有,但是只能SDK里面來寫代碼,所以就想問一問! (有償)
    發(fā)表于 12-04 10:01

    圖紙模板中的文本變量

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

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

    “ ?圖紙模板規(guī)范了圖紙的尺寸大小,同時可以在標(biāo)題欄顯示與圖紙相關(guān)的信息,如產(chǎn)品名稱、版本、日期等。從標(biāo)準(zhǔn)化的角度考慮,公司通常會定義A0~A4的圖紙模板,用于不同的設(shè)計(jì)場合。KiCad提供了一種
    的頭像 發(fā)表于 11-13 18:13 ?576次閱讀
    A0到A4的圖框只要一個圖紙<b class='flag-5'>模板</b>就搞定了?

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

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

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

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

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

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

    使用helloword的模板,上傳了IG502但不能運(yùn)行,為什么?

    我使用helloword的模板,上傳了IG502,但不能運(yùn)行,請大神幫忙。系統(tǒng)日志如下: sntpc[1226]: ntp request error: 113, No route to host
    發(fā)表于 07-24 08:29

    如何使用Vitis自帶的LWIP模板進(jìn)行PS端千兆以太網(wǎng)TCP通信?

    開發(fā)板有兩路千兆以太網(wǎng),通過RGMII接口連接,本實(shí)驗(yàn)演示如何使用Vitis自帶的LWIP模板進(jìn)行PS端千兆以太網(wǎng)TCP通信。
    的頭像 發(fā)表于 04-28 10:44 ?3792次閱讀
    如何使用Vitis自帶的LWIP<b class='flag-5'>模板</b>進(jìn)行PS端千兆以太網(wǎng)TCP通信?

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

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

    電源模塊測試數(shù)據(jù)一鍵導(dǎo)出,自定義報(bào)告模板

    NSAT-8000電源模塊測試系統(tǒng)可以便捷、快速地創(chuàng)建多樣化、個性化的報(bào)告模板,方便統(tǒng)一匯總、管理、對比數(shù)據(jù),為電源模塊的性能分析和評估提供有力支持。
    的頭像 發(fā)表于 04-16 14:43 ?379次閱讀

    微軟Visio網(wǎng)頁版新增八個可定制思維導(dǎo)圖模板

    4 月 10 日,微軟發(fā)布公告表明,作為Visio Plan 1與Visio Plan 2許可證持有者,如今可以在Web版Visio中暢享思維導(dǎo)圖模板服務(wù)。
    的頭像 發(fā)表于 04-10 10:07 ?874次閱讀

    TouchGFX的Application Templates模板里面為什么只有2個?

    如題,手邊有一塊F429 Discovery的板子,然后打開touchGFX , 發(fā)現(xiàn)模板里面只有兩種類型。我卸載了TouchGFX再重新裝也沒有用。找不到配置的地方,那個online的選項(xiàng),明明已經(jīng)連接上了網(wǎng)絡(luò),但是還是顯示灰色,不知道為什么。
    發(fā)表于 04-09 06:49

    Altium Designer與Gerber模板的導(dǎo)入指南

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

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

    1.3.1拷貝模板工程和庫文件 模板路徑:CW32F003_StandardPeripheralLib_V1.4ExamplesTemplate 庫文件路徑
    的頭像 發(fā)表于 03-27 09:39 ?548次閱讀
    CW32F003E4芯片入門學(xué)習(xí):4.工程<b class='flag-5'>模板</b>創(chuàng)建(使用例程或<b class='flag-5'>模板</b>)

    LabVIEW模板匹配位置信息導(dǎo)出

    大家好,我在利用ni vision assistant生成的模板匹配界面時,想要將每一個匹配物體的位置信息導(dǎo)出到word或者Excel,但是他這個匹配個數(shù)不確定,怎么樣把匹配到的所有物體信息導(dǎo)出呀?利用哪些編程?謝謝大家了
    發(fā)表于 03-11 20:22
    主站蜘蛛池模板: www.黄色免费 | 日日干夜夜操视频 | 福利体验区 | 精品久久久久久婷婷 | 日本免费黄色录像 | 天天夜约| 性欧美极品 | 一本到卡二卡三卡视频 | 高h污快穿文汁水四溅 | 97夜夜操| 色多多视频在线播放 | 爱爱的免费视频 | 理论片久久 | 人人做人人爽久久久精品 | 特黄特黄一级高清免费大片 | 两人性世界 | 午夜影院普通用户体验区 | 天天激情 | 伊人电影综合网 | 亚洲乱码一二三四区 | 天天色综合社区 | 天天色综合6 | 鲁一鲁色一色 | 一道精品视频一区二区三区男同 | 亚洲一区欧美日韩 | 免费观看a毛片一区二区不卡 | 亚洲小视频 | jzzjlzz亚洲乱熟在线播放 | 欧美日韩国产网站 | 日韩午夜大片 | 琪琪午夜伦埋大全影院 | 午夜老司机福利 | 四虎影院在线观看网站 | 天天看天天爽天天摸天天添 | 2021国产成人精品久久 | 五月婷婷激情在线 | 手机看高清特黄a大片 | 很黄很暴力 很污秽的小说 很黄很黄叫声床戏免费视频 | a级毛片免费观看网站 | 免费国内精品久久久久影院 | 国产精品漂亮美女在线观看 |