chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

C++中為什么需要函數模板、類模板?

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

掃碼添加小助手

加入工程師交流群

[導讀] 最近使用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: /*一般會將數據放在私有區(qū),以對外隱藏*/ 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: /*一般會將數據放在私有區(qū),以對外隱藏*/ int x; int y; };

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

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

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)

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

總結一下

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

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

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

責任編輯:haq

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

    關注

    90

    文章

    3707

    瀏覽量

    96717
  • 模板
    +關注

    關注

    0

    文章

    110

    瀏覽量

    21020
  • C++
    C++
    +關注

    關注

    22

    文章

    2121

    瀏覽量

    76687

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    目標追蹤的簡易實現:模板匹配

    。 因此,模板匹配算法步驟就很明確了:用模板在整幀圖像掃描,對于一個超清視頻(1280*720 P)如果我們用 50*50 大小的模板進行匹配,掃描完整個圖像就
    發(fā)表于 10-28 07:21

    店鋪裝修模板同步接口技術解析

    ? ?在電商平臺開發(fā),店鋪裝修模板的跨系統(tǒng)同步是核心需求。本文從接口設計、數據結構和實現邏輯三個維度進行技術拆解。 一、接口設計規(guī)范 基礎參數 請求方法:POST 端點路徑:/api/v1
    的頭像 發(fā)表于 10-17 15:24 ?193次閱讀
    店鋪裝修<b class='flag-5'>模板</b>同步接口技術解析

    Allegro Skill工藝輔助之導入疊層模板

    在PCB設計,導入疊層模板能夠確保設計的標準化和規(guī)范化,避免因手動設置疊層參數而可能出現的錯誤或不一致情況。
    的頭像 發(fā)表于 07-10 17:10 ?2788次閱讀
    Allegro Skill工藝輔助之導入疊層<b class='flag-5'>模板</b>

    基于LockAI視覺識別模塊:C++目標檢測

    本文檔基于瑞芯微RV1106的LockAI凌智視覺識別模塊,通過C++語言做的目標檢測實驗。本文檔展示了如何使用lockzhiner_vision_module::PaddleDet進行目標檢測,并通過lockzhiner_vision_module::Visualiz
    的頭像 發(fā)表于 06-06 13:56 ?597次閱讀
    基于LockAI視覺識別模塊:<b class='flag-5'>C++</b>目標檢測

    HarmonyOS5云服務技術分享--Serverless抽獎模板部署

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

    基于LockAI視覺識別模塊:C++模板匹配

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

    基于LockAI視覺識別模塊:C++模板匹配

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

    基于LockAI視覺識別模塊:C++模板匹配

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

    基于LockAI視覺識別模塊:C++模板匹配

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

    C++學到什么程度可以找工作?

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

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

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

    基于OpenHarmony標準系統(tǒng)的C++公共基礎庫案例:ThreadPoll

    1、程序簡介該程序是基于OpenHarmony標準系統(tǒng)的C++公共基礎庫的線程池處理:ThreadPoll。本案例完成如下工作:創(chuàng)建1個線程池,設置該線程池內部有1024個線程空間。啟動5個線程
    的頭像 發(fā)表于 02-10 18:09 ?592次閱讀
    基于OpenHarmony標準系統(tǒng)的<b class='flag-5'>C++</b>公共基礎<b class='flag-5'>類</b>庫案例:ThreadPoll

    Spire.XLS for C++組件說明

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

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

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

    EE-112:模擬C++實現

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