那曲檬骨新材料有限公司

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

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

3天內不再提示

函數模板與類模板的基本概念及實現原理

FPGA之家 ? 來源:CSDN博客嵌入式客棧 ? 作者:CSDN博客嵌入式客棧 ? 2022-03-15 11:21 ? 次閱讀
[導讀] 最近使用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:
/*一般會將數據放在私有區,以對外隱藏*/
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:
/*一般會將數據放在私有區,以對外隱藏*/
intx;
inty;
};

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

318025dc-8d80-11ec-952b-dac502259ad0.png

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

319ca86a-8d80-11ec-952b-dac502259ad0.png

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

怎么實現的呢?

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

  • 函數模板(Function templates)
  • 類模板(Class templates)
  • **成員模板(Member templates) **

函數模板

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

template<classidentifier>function_declaration;
template<typenameidentifier>function_declaration;
  • template 為模板關鍵字
  • 、 定義函數參數泛型類型或函數體類變量泛型類型

比如:

#include
usingnamespacestd;

template<typenameT>
Tmax(Ta,Tb)
{
returna>b?a:b;
}

又或者寫成如下形式:

#include
usingnamespacestd;

template<classT>
Tmax(Ta,Tb)
{
returna>b?a:b;
}

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

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

類模板

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

template<typenameT>
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_T<int>p1(1,2);
Point_T<float>p2(1.1f,2.2f);
cout<endl<endl;
cout<endl<endl;
}

以上述簡單例子看,分別構造了整型點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)

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

總結一下

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

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

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

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

    關注

    88

    文章

    3637

    瀏覽量

    93980
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62968
  • 原理
    +關注

    關注

    4

    文章

    550

    瀏覽量

    44970

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

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

收藏 人收藏

    評論

    相關推薦

    為什么我的labview函數模板里沒有file I/O子模板?

    為什么我的labview函數模板里沒有file I/O子模板?
    發表于 10-30 17:26

    ActiveX函數模板的基本使 用

    出現最小化后的Excel圖標,執行預先定義的宏后自動退出Excel, 從而有效地避免了報告生成過程中用戶的誤操作。這里僅介紹了ActiveX函數模板的基本使用,以及調用Excel過程的總體框架,用戶可以根據實際需要進行擴充從而構建出自己的函 數庫。
    發表于 01-26 22:47

    USB基本概念及從機編程方法介紹

    慕課蘇州大學.嵌入式開發及應用.第四章.較復雜通信模塊.USB基本概念及從機編程方法0 目錄4 較復雜通信模塊4.4 USB基本概念及從機編程方法4.4.1 課堂重點4.4.2 測試與作業5 下一
    發表于 11-08 09:14

    如何創建庫函數模板

    如何創建庫函數模板?STM32固件庫是什么?
    發表于 12-01 07:38

    單片機常用函數模板

    單片機常用函數模板以及在KEIL的Templates中添加自己的注釋模板 keil通用51單片機32單片機keil添加keil通用switch (){case 0: break;case 1
    發表于 01-05 07:59

    介紹一下IAR的文件模板函數模板

    IAR的文件模板是怎樣的?IAR的函數注釋模板是怎樣的?
    發表于 01-27 07:17

    SPI回調函數模板錯誤?

    我想我找到了另一個“WTF?”:對于SPI驅動,Peripherals Tool提供了一個回調函數模板:選擇一個 Flexcomm 實例并單擊“復制到剪貼板”。這就是你會得
    發表于 03-15 08:15

    轉載一篇MSP430中斷c語言函數模板

    轉載一篇MSP430中斷c語言函數模板包括了基本模塊的所有中斷模板,感興趣的小伙伴們可以看看。
    發表于 07-26 11:11 ?3次下載

    基于RF射頻知識基本概念及DTD無線產品介紹

    基于RF射頻知識基本概念及DTD無線產品介紹
    發表于 10-25 08:38 ?8次下載
    基于RF射頻知識<b class='flag-5'>基本概念及</b>DTD無線產品介紹

    Vision控件和函數模板及圖像處理步驟的詳細資料說明

    本文檔的主要內容詳細介紹的是Vision控件和函數模板及圖像處理步驟的詳細資料說明。Vision 控件模板 Vision 控件模板位于 LabVIEW 控件模板的最頂層,由一下元素組
    發表于 05-29 08:00 ?14次下載
    Vision控件和<b class='flag-5'>函數模板</b>及圖像處理步驟的詳細資料說明

    C++之類模板深入學習的總結

    模板可以定義任意多個不同的類型參數;模板可以被部分特化和完全特化;特化的本質是模板的分開實現
    的頭像 發表于 12-24 15:46 ?592次閱讀

    C++之函數模板概念及意義

    一、函數模板的引出:1、c++中有幾種交換變量的方法:(1)定義宏代碼塊(2)定義函數代碼版本一:#include <iostream>#include <string>using namespace
    的頭像 發表于 12-24 15:58 ?909次閱讀

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

    [導讀] 最近使用C++做些編程,把日常遇到的些比較重要的概念總結分享一下。本文來分享一下模板的原理,以及為什么需要模板,使用時的基本要
    的頭像 發表于 03-12 14:31 ?3222次閱讀

    你們知道什么是函數模板模板

    [導讀] 最近使用C++做些編程,把日常遇到的些比較重要的概念總結分享一下。本文來分享一下模板的原理,以及為什么需要模板,使用時的基本要
    的頭像 發表于 05-17 15:29 ?2229次閱讀
    你們知道什么是<b class='flag-5'>函數模板</b>、<b class='flag-5'>類</b><b class='flag-5'>模板</b>?

    模板函數以及模板基本概念以及原理

    最近使用C++做些編程,把日常遇到的些比較重要的概念總結分享一下。本文來分享一下模板的原理,以及為什么需要模板,使用時的基本要點。
    的頭像 發表于 07-11 10:42 ?1392次閱讀
    博发百家乐官网游戏| 威尼斯人娱乐场28| 百家乐官网娱乐真钱游戏| 六合彩开奖现场直播| 百家乐开庄几率| 988百家乐官网娱乐| 大赢家足球即时比分| 网络百家乐金海岸| 百家乐官网游戏辅助| 假日国际娱乐城| 澳门百家乐网上娱乐场开户注册| 百家乐官网旺门打法| 瑞奇国际娱乐| 金花百家乐的玩法技巧和规则| 百家乐官网荷| 百家乐官网游戏补牌规则| 大发888娱乐城网址| 立博百家乐游戏| 百家乐官网斗地主在哪玩| bet365 网址| 百家乐如何看| 百家乐官网群dmwd| 百家乐官网庄闲局部失衡| 红桃k娱乐城备用网址| 百家乐网上娱乐场开户注册| 百家乐官网庄闲出现几| 百家乐官网视频游戏聊天| 顶级赌场dj| rmb百家乐的玩法技巧和规则| 克拉克百家乐下载| 百家乐官网程序开户发| 实战百家乐官网博彩正网| 一二博网址| 大发888娱乐场客户端下载| 百家乐赌博技巧大全| 一共33楼24楼风水怎么说| 百家乐官网娱乐城注册| 维多利亚娱乐| 大发888怎么开户| 芝加哥百家乐的玩法技巧和规则| 百家乐视频多开器|