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

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你們知道什么是函數模板、類模板?

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

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

為什么需要模板

比如需要設計一個描述點的類,大致很快可以寫成這樣:

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

可問題是,在有的場合這點的坐標系有可能不需要浮點,比如界面設計中點往往是整型表示即可,那此時就需要再設計一個整型成員類:

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

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

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

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

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

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

怎么實現的呢?

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

函數模板(Function templates)

類模板(Class templates)

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

函數模板

函數模板其基本語法范式為:

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

template 為模板關鍵字

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

比如:

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

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

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

類模板

與函數模板類似,類內部成員數據或者函數的參數或變量會使用,模板關鍵字定義的泛型名。比如:

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

這小段代碼就回答了之前提出的問題,可以支持不同數據類型的點。

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

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

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)

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

總結一下

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

編輯:jq

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

    關注

    88

    文章

    3671

    瀏覽量

    94663
  • 函數
    +關注

    關注

    3

    文章

    4363

    瀏覽量

    63778
  • C++
    C++
    +關注

    關注

    22

    文章

    2116

    瀏覽量

    74531
  • 編譯器
    +關注

    關注

    1

    文章

    1651

    瀏覽量

    49712

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

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

收藏 人收藏

    評論

    相關推薦

    STM32CUBEide有沒有像KEIL一樣可以自己指定函數注釋模板的方法?

    最近從keil轉到CUBEIDE編程了,現在非常不舒服的一點是函數注釋方面。STM32CUBEide有沒有像KEIL一樣可以自己指定函數注釋模板的方法,可以注釋函數形參啊、
    發表于 03-11 08:06

    EE-128:C語言中的DSP:從C調用匯編成員函數

    電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編成員函數.pdf》資料免費下載
    發表于 01-07 13:48 ?0次下載
    EE-128:C語言中的DSP:從C調用匯編<b class='flag-5'>類</b>成員<b class='flag-5'>函數</b>

    think-cell——使用JSON數據實現自動化(二)

    26.4 遠程提供模板 還可以通過遠程服務器提供帶有 think-cell 圖表的模板文件。在這種情況下,鍵的值是 URL 而不是本地路徑,如上面的遠程 JSON 示例所示。URL 可以指定為協議
    的頭像 發表于 01-03 10:12 ?252次閱讀
    think-cell——使用JSON數據實現自動化(二)

    如何用VSCODE創建一個LE5010的工程模板

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

    圖紙模板中的文本變量

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

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

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

    摩爾線程開源高性能線性代數模板庫MUTLASS

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

    手寫圖像模板匹配算法在OpenCV中的實現

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

    使用C語言實現函數模板

      用C語言能不能實現一個通用的函數,既能完成整數的相加,又能完成浮點數的相加?
    的頭像 發表于 11-09 11:38 ?723次閱讀

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

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

    韓國將開始量產用于第6代OLED制造工藝的精細金屬掩模板

    在顯示技術日新月異的今天,OLED(有機發光二極管)因其出色的色彩表現和超薄的設計,逐漸成為了高端顯示市場的寵兒。然而,在這一領域的制造過程中,一個名為精細金屬掩模板(FMM)的關鍵耗材,卻長期由
    的頭像 發表于 06-21 16:07 ?705次閱讀

    下載了ModusToolbox 3.1.0并成功添加了CYBT0243053的模板應用程序,如何使用USB串口線進行調試?

    我下載了 Modus Toolbox 3.1.0 并成功添加了 CYBT0243053 的模板應用程序。 但我在調試模板代碼時遇到了錯誤。 我正在使用 USB 串口線進行調試。 我該如何進行調試
    發表于 05-20 08:19

    STM32cubeMX 6.10.0使用LL庫生成定時器模板報錯的原因?

    分頻參數設置 2 - 1(X - Y)情況下,生成的模板出現了bug /* USER CODE END TIM6_Init 1 */TIM_InitStruct.Prescaler
    發表于 05-20 07:50

    如何使用Vitis自帶的LWIP模板進行PS端千兆以太網TCP通信?

    開發板有兩路千兆以太網,通過RGMII接口連接,本實驗演示如何使用Vitis自帶的LWIP模板進行PS端千兆以太網TCP通信。
    的頭像 發表于 04-28 10:44 ?4763次閱讀
    如何使用Vitis自帶的LWIP<b class='flag-5'>模板</b>進行PS端千兆以太網TCP通信?

    使用SDK5生成工程模板程序時老是出現錯誤是為啥?

    使用st SDK5生成工程模板程序時老是出現這樣的錯誤是為啥?我的SDK:5.0.1STM32CubeMX:4.26.0Keil5:5.25 求助萬能的網友。
    發表于 04-28 08:36
    主站蜘蛛池模板: 不卡无毒免费毛片视频观看 | 国模私拍视频在线观看 | 黄网站色视频大全免费观看 | 国产你懂的在线 | 精品国产一二三区在线影院 | 在线观看www日本免费网站 | www.4hu影院| 午夜dy888理论在线播放 | 在线视频精品视频 | 天堂资源在线官网资源 | 国产欧美在线一区二区三区 | 末发育女一区二区三区 | 亚洲欧美日韩国产一区二区三区精品 | 四虎看片| 国产女人18毛片水真多18精品 | 好大好猛好爽好深视频免费 | 亚洲一区二区影院 | 国产亚洲欧美日韩俺去了 | 欧洲熟色妇| 欧美综合在线视频 | 在线观看黄色一级片 | 成人的天堂视频一区二区三区 | 色视频网址 | 456成人免费高清视频 | 亚洲天堂网站在线 | 亚洲狠狠婷婷综合久久久图片 | 一个色在线视频 | 国产三级网站在线观看 | www.九色.com| 男女性生动态免费视频 | 天天艹天天艹 | 欧美日韩一区不卡 | 一区二区三区四区免费视频 | 亚洲综合免费 | 午夜免费观看_视频在线观看 | 天堂资源 | 欧美1819 | 久久青草国产手机看片福利盒子 | 亚洲欧美网 | 国产免费高清视频在线观看不卡 | 久草热线视频 |