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

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

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

現(xiàn)代C++之模板類型推導(dǎo)

汽車電子技術(shù) ? 來(lái)源:程序芯世界 ? 作者:CoderWorld ? 2023-03-02 16:18 ? 次閱讀

1.傳統(tǒng)C++ VS 現(xiàn)代C++

傳統(tǒng)C++中,參數(shù)的類型都必須明確定義,這其實(shí)對(duì)我們快速進(jìn)行編碼沒有任何幫助,尤其是當(dāng)我們面對(duì)一大堆復(fù)雜的模板類型時(shí),必須明確的指出變量的類型才能進(jìn)行后續(xù)的編碼,這不僅拖慢我們的開發(fā)效率,也讓代碼變得又臭又長(zhǎng)。

C++11 引入了類型推導(dǎo),讓編譯器來(lái)操心變量的類型。這使得 C++ 也具有了和其他現(xiàn)代編程語(yǔ)言一樣,某種意義上提供了無(wú)需操心變量類型的使用習(xí)慣。

下面代碼中CoderWorld(1,"Traditional","C++")是傳統(tǒng)C++寫法而CoderWorld(2,"Modern","C++")是現(xiàn)代C++寫法,雖然使用了模板,但是其用法就像調(diào)用沒有使用模板的普通函數(shù)一樣,這樣的代碼明顯更加具有易讀性。這是因?yàn)镃++11引入了類型推導(dǎo),編譯器會(huì)自動(dòng)推導(dǎo)出參數(shù)的類型。

template

2.模板類型參數(shù)推導(dǎo)

模板類型參數(shù)推導(dǎo)共分為四種情況,下面會(huì)分別對(duì)這四種情況進(jìn)行詳細(xì)闡述。

  1. 函數(shù)形參的類型為指針或引用類型,但不是通用引用類型
  2. 函數(shù)形參的類型為通用引用類型
  3. 函數(shù)形參的類型既不是指針也不是引用
  4. 數(shù)組或函數(shù)名
模板類型推導(dǎo)案例1
template<typename T>
void CoderWorld(T& param);

int x = 27;
const int& rx = x;

CoderWorld(rx); // T is const int,  param's type is const int&

上述代碼中函數(shù)CoderWorld(T& param)中形參的類型是引用類型(即T&), 推導(dǎo)遵循的規(guī)則如下:

在函數(shù)形參的類型為指針或引用類型,但不是通用引用類型情況下,需要去掉實(shí)參類型中的引用(這里的去掉引用是指去掉實(shí)參類型的引用,而不是形參param的類型T&中的&)。

對(duì)于CoderWorld(rx),實(shí)參rx為const int&類型,根據(jù)上述應(yīng)該去掉實(shí)參rx 類型的引用,即將const int&中的&去掉,因此T被推導(dǎo)為const int 類型,最終param的類型T&為const int &類型。

模板類型推導(dǎo)案例2
template<typename T> void CoderWorld(T&& param);

int x = 27;
const int cx = x;
const int& rx = x;

CoderWorld(cx);//cx is lvale,so T is const int&,  param's type is const int&
CoderWorld(27);//27 is rvale,so T is int,param's type is int&&

上述代碼中函數(shù)CoderWorld(T&& param) 形參類型是通用引用類型(即T&&),推導(dǎo)規(guī)則遵循如下:

在函數(shù)形參的類型為通用引用類型情況下,當(dāng)實(shí)參的類型是左值時(shí),param的類型和T的類型均為左值引用,當(dāng)實(shí)參的類型是右值時(shí),T的類型與實(shí)參一致,param的類型是實(shí)參類型的右值引用。

代碼中cx是一個(gè)左值,因此T的類型與形參param的類型均推導(dǎo)為左值引用const int &。

當(dāng)CoderWorld傳入的參數(shù)是27時(shí),因?yàn)?7是右值,所以T的類型推導(dǎo)為int,param的類型推導(dǎo)為右值引用int&&

模板類型推導(dǎo)案例3
template<typename T> void CoderWorld(T param);

const int cx = x;
const int& rx = x;

CoderWorld(cx);//T and param are both int
CoderWorld(rx);// T and param are both int

上述代碼中CoderWorld(T param)形參類型T即不是指針也不是引用類型,實(shí)際上是值傳遞,也就是說(shuō)這種情況下形參param是實(shí)參的一個(gè)拷貝,推導(dǎo)規(guī)則遵循如下:

在函數(shù)形參的類型既不是指針也不是引用類型的情況下,如果實(shí)參的類型有引用,則忽略掉引用部分,如果實(shí)參類型有const,則忽略掉const部分,如果有volatile也忽略掉。

代碼中實(shí)參cx的類型為const int,因此忽略掉const之后T的類型為int,形參param的類型也為int。

代碼中實(shí)參rx的類型為const int &,去掉引用和const之后T的類型為int,形參param的類型也為int。

模板類型推導(dǎo)案例4

這是一種特殊的情況,就是當(dāng)實(shí)參的類型是為數(shù)組和函數(shù)的時(shí)候需要注意。C++中,數(shù)組可以退化成指針,一個(gè)函數(shù)類型也是可以退化成指針的。具體的情況如下代碼所示,結(jié)合注釋記住這段代碼中的CoderWorld1和CoderWorld2對(duì)數(shù)組和函數(shù)的推導(dǎo)情況即可。

template<typename T>
 void CoderWorld1(T param);
 template <typename T>
 void CoderWorld2(T& param);

 int arr = {0,1,2,3};
 void someFunc(int,double);

 CoderWorld1(arr);//arr會(huì)退化成指針,即param的類型為int*
 CoderWorld2(arr);//這里很有意思,param會(huì)被推導(dǎo)為 int (&)[4]
 //和上面的情況相比好處是param包含了數(shù)組的元素?cái)?shù)量信息,可以獲取到數(shù)組的成員數(shù)。
 CoderWorld1(someFunc);//param類型為函數(shù)指針 void (*)(int,double)
 CoderWorld2(someFunc);//param類型為函數(shù)引用 void (&)(int,double)

3.模板類型推導(dǎo)總結(jié)

參數(shù)類型 例子 推導(dǎo)規(guī)則
指針或引用類型,但不是通用引用類型 template void CoderWorld(T& param);void CoderWorld(T* param); 忽略實(shí)參引用
通用引用類型 templatevoid CoderWorld(T&& param); 實(shí)參為左值param為左值引用實(shí)參為右值param為右值引用
既不是指針也不是引用 templatevoid CoderWorld(T param); 忽略引用和const類型
數(shù)組或函數(shù)名 CoderWorld(arr)CoderWorld(someFunc) 數(shù)組退化為指針函數(shù)退化為函數(shù)指針image
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1661

    瀏覽量

    31884
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    915

    瀏覽量

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

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73302
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于C++模板總結(jié)

    大家好,今天給大家分享一篇關(guān)于 C++ 模板總結(jié)概述。
    發(fā)表于 09-19 11:55 ?455次閱讀

    C++打印類型名稱的分析與實(shí)現(xiàn)

    打印類型名稱,聽起來(lái)像是一個(gè)很簡(jiǎn)單的需求,但在目前的C++當(dāng)中,并非易事。
    發(fā)表于 10-20 14:08 ?1272次閱讀

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?857次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?1074次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1020次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    鴻蒙c++模板開發(fā)詳解

    鴻蒙c++模板開發(fā)詳解
    發(fā)表于 09-11 15:28

    C++課程資料詳細(xì)資料合集包括了:面向?qū)ο蟪绦蛟O(shè)計(jì)與C++,算法,函數(shù)等

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++課程資料資料合集包括了:面向?qū)ο蟪绦蛟O(shè)計(jì)與C++,算法,函數(shù),概述, C++語(yǔ)言基礎(chǔ),構(gòu)造數(shù)據(jù)類型,數(shù)據(jù)類型
    發(fā)表于 07-09 08:00 ?18次下載
    <b class='flag-5'>C++</b>課程資料詳細(xì)資料合集包括了:面向?qū)ο蟪绦蛟O(shè)計(jì)與<b class='flag-5'>C++</b>,算法,函數(shù)等

    數(shù)據(jù)結(jié)構(gòu)的各種算法實(shí)現(xiàn)資料的C++模板概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)結(jié)構(gòu)的各種算法實(shí)現(xiàn)資料的C++模板概述。
    發(fā)表于 12-20 16:35 ?6次下載

    C++函數(shù)模板的概念及意義

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

    c++ 布爾類型和引用的學(xué)習(xí)總結(jié)

    c語(yǔ)言里面我們知道是沒有布爾數(shù)據(jù)類型的,而在C++中添加了布爾數(shù)據(jù)類型(bool),它的取值是:true或者false(也就是1或者0),在內(nèi)存大小上它占用一個(gè)字節(jié)大小。
    的頭像 發(fā)表于 12-24 18:03 ?522次閱讀

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

    [導(dǎo)讀] 最近使用C++做些編程,把日常遇到的些比較重要的概念總結(jié)分享一下。本文來(lái)分享一下模板類的原理,以及為什么需要模板類,使用時(shí)的基本要點(diǎn)。 為什么需要模板 比如需要設(shè)計(jì)一個(gè)描述點(diǎn)
    的頭像 發(fā)表于 03-12 14:31 ?3060次閱讀

    TouchGFX中Callback模板實(shí)現(xiàn)原理

    ,TouchGFX是用C++編寫的,借助C++模板特性,定義了一組Callback模板,基于此模板來(lái)實(shí)現(xiàn)響應(yīng)的功能。
    發(fā)表于 08-04 18:51 ?15次下載
    TouchGFX中Callback<b class='flag-5'>模板</b>實(shí)現(xiàn)原理

    C++學(xué)習(xí)筆記c++的基本認(rèn)識(shí)

    自這篇文章我們即將開始C++的奇幻之旅,其內(nèi)容主要是讀C++ Primer的總結(jié)和筆記,有興趣可以找原版書看看,對(duì)于學(xué)習(xí)C++還是有很大幫助的。這篇文章將從一個(gè)經(jīng)典的程序開始介紹C++
    的頭像 發(fā)表于 03-17 13:57 ?627次閱讀

    C++入門string

    前一篇文章我們已經(jīng)了解了C++中的基本類型,C++還提供了很多抽象數(shù)據(jù)類型,例如字符串string,string包含多個(gè)字符,以及可變長(zhǎng)度的vector,vector可以包含多個(gè)同一
    的頭像 發(fā)表于 03-17 13:58 ?482次閱讀

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問(wèn)題,讓大家領(lǐng)略現(xiàn)代C++美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住
    的頭像 發(fā)表于 10-30 16:35 ?698次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒<b class='flag-5'>現(xiàn)代</b><b class='flag-5'>C++</b>地圖