最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11新特性之變長參數(shù)模板詳解

 更新時(shí)間:2021年08月25日 16:08:02   作者:Codebowl  
本文主要介紹了C++11變長參數(shù)模板,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

C++11 變長參數(shù)模板

在C++11之前,無論是類模板 還是函數(shù)模板,都只能按其指定的樣子,接受一組固定數(shù)量的模板參數(shù);

這已經(jīng)大大提升了代碼的復(fù)用!

在C++11之后,加入了新的表示方 法,允許任意個(gè)數(shù)、任意類別的模板參數(shù),同時(shí)也不需要在定義時(shí)將參數(shù)的個(gè)數(shù)固定。更加像”黑魔法“了。

template<typename... Ts> class Magic;

模板類 Magic 的對(duì)象,能夠接受不受限制個(gè)數(shù)的 typename 作為模板的形式參數(shù),例如下面的定義:

class Magic<int,
std::vector<int>,
std::map<std::string,
std::vector<int>>> darkMagic;

既然是任意形式,所以個(gè)數(shù)為 0 的模板參數(shù)也是可以的:class Magic<> nothing;。 如果不希望產(chǎn)生的模板參數(shù)個(gè)數(shù)為 0,可以手動(dòng)的定義至少一個(gè)模板參數(shù):

template<typename Require, typename... Args> class Magic;

變長函數(shù)參數(shù)包

除了在模板參數(shù)中能使用 ... 表示不定長模板參數(shù)外,函數(shù)參數(shù)也使用同樣的表示法代表不定長參數(shù)。

傳統(tǒng) C 中的 printf 函數(shù),雖然也能達(dá)成不定個(gè)數(shù) 的形參的調(diào)用,但其并非類別安全。而 C++11 除了能定義類別安全的變長參數(shù)函數(shù)外,還可以使類似 printf 的函數(shù)能自然地處理非自帶類別的對(duì)象。除了在模板參數(shù)中能使用 ... 表示不定長模板參數(shù)外, 函數(shù)參數(shù)也使用同樣的表示法代表不定長參數(shù),這也就為我們簡(jiǎn)單編寫變長參數(shù)函數(shù)提供了便捷的手段, 例如:

template<typename... Args> 
void printf(const std::string &str, Args... args);

其中,Args 與 args 分別代表模板與函數(shù)的變長參數(shù)集合, 稱之為參數(shù)包 (parameter pack)。參數(shù)包必須要和運(yùn)算符"..."搭配使用。

如何解參數(shù)包

長參數(shù)模板中,變長參數(shù)包無法如同一般參數(shù)在類或函數(shù)中使用;這個(gè)很好理解!

因?yàn)樵跅V校覀冃枰戎篮瘮?shù)有多少個(gè)參數(shù),才可以入棧,但是我們不知道變長參數(shù)有多長,所以需要特殊手法!

sizeof()獲得函數(shù)參數(shù)個(gè)數(shù)

首先,我們可以使用 sizeof... 來計(jì)算參數(shù)的個(gè)數(shù),:

template<typename... Ts>
void magic(Ts... args) 
{
    std::cout << sizeof...(args) << std::endl;
}

遞歸模板函數(shù)

遞歸去獲得所有參數(shù),是非常容易想到的方法,這種方法不斷遞歸地向函數(shù)傳遞模板參數(shù),進(jìn)而達(dá)到遞歸遍歷所有模板參數(shù)的目的。

printf 會(huì)不斷地遞歸調(diào)用自身:函數(shù)參數(shù)包 args... 在調(diào)用時(shí), 會(huì)被模板類別匹配分離為 T value和 Args... args。 直到 args... 變?yōu)榭諈?shù),則會(huì)與簡(jiǎn)單的 printf(const char *s) 形成匹配,退出遞歸。

//遞歸模板函數(shù)
template<typename T0>
void printf1(T0 value)
{
    std::cout << value << std::endl;
}
template<typename T, typename... Ts>
void printf1(T value, Ts... args) 
{
    std::cout << value << std::endl;
    printf1(args...);
}
int RecursiveTemplateFunc() 
{
    printf1(1, 2, "123", 1.1);
    return 0;
}

變參模板展開

上面的遞歸很容易理解,但是比較繁瑣,那么還有沒有什么好方法呢?

在 C++17 中增加了變參模板展開的支持,于是你可以在一個(gè)函數(shù)中完 成 printf 的編寫:

//變參模板展開
template<typename T0, typename... T>
void printf2(T0 t0, T... t) 
{
    std::cout << t0 << std::endl;
    if constexpr (sizeof...(t) > 0) 
        printf2(t...);
}

結(jié)論

模板作為C++中的”黑魔法“般的武器,學(xué)起來比較難,但當(dāng)掌握后,確實(shí)非常高級(jí),變長參數(shù)模板對(duì)我們寫模板有很大的幫助!

本文的代碼地址: Modern_Cpp_Practice.

到此這篇關(guān)于C++11新特性之變長參數(shù)模板詳解的文章就介紹到這了,更多相關(guān)C++11 變長參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++讀寫文本文件、二進(jìn)制文件的方法

    C/C++讀寫文本文件、二進(jìn)制文件的方法

    今天小編就為大家分享一篇C/C++讀寫文本文件、二進(jìn)制文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 利用C語言實(shí)現(xiàn)任務(wù)調(diào)度的示例代碼

    利用C語言實(shí)現(xiàn)任務(wù)調(diào)度的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用純C語言實(shí)現(xiàn)任務(wù)調(diào)度(可用于STM32、C51等單片機(jī)),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • C語言版五子棋游戲的實(shí)現(xiàn)代碼

    C語言版五子棋游戲的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C語言版五子棋游戲的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++破壞MBR的代碼

    C++破壞MBR的代碼

    這篇文章主要介紹了C++破壞MBR的代碼,涉及到對(duì)硬盤的主引導(dǎo)記錄的破壞性操作,具有一定的參考價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語言實(shí)現(xiàn)順序循環(huán)隊(duì)列實(shí)例

    C語言實(shí)現(xiàn)順序循環(huán)隊(duì)列實(shí)例

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)順序循環(huán)隊(duì)列實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • vsCode配置import@路徑提示的實(shí)現(xiàn)步驟

    vsCode配置import@路徑提示的實(shí)現(xiàn)步驟

    在導(dǎo)入文件設(shè)置路徑的時(shí)候方便了很多,本文主要介紹了vsCode配置import@路徑提示的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • C語言實(shí)現(xiàn)影院管理系統(tǒng)程序設(shè)計(jì)

    C語言實(shí)現(xiàn)影院管理系統(tǒng)程序設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)影院管理系統(tǒng)程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言中函數(shù)指針與軟件設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    C語言中函數(shù)指針與軟件設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    今天小編就為大家分享一篇關(guān)于C語言中函數(shù)指針與軟件設(shè)計(jì)經(jīng)驗(yàn)總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言實(shí)現(xiàn)循環(huán)單鏈表的示例代碼

    C語言實(shí)現(xiàn)循環(huán)單鏈表的示例代碼

    這篇文章主要給大家詳細(xì)介紹了C語言如何實(shí)現(xiàn)循環(huán)單鏈表,文章通過代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • C++中的四種類型轉(zhuǎn)換

    C++中的四種類型轉(zhuǎn)換

    類型轉(zhuǎn)換有c風(fēng)格的,當(dāng)然還有c++風(fēng)格的。c風(fēng)格的轉(zhuǎn)換的格式很簡(jiǎn)單(TYPE)EXPRESSION,但是c風(fēng)格的類型轉(zhuǎn)換有不少的缺點(diǎn),有的時(shí)候用c風(fēng)格的轉(zhuǎn)換是不合適的,因?yàn)樗梢栽谌我忸愋椭g轉(zhuǎn)換,
    2015-08-08

最新評(píng)論

旬阳县| 青铜峡市| 南靖县| 沙田区| 朔州市| 阿克陶县| 茂名市| 元氏县| 海林市| 辛集市| 辽源市| 平潭县| 亳州市| 乐平市| 郸城县| 新干县| 呼伦贝尔市| 仙居县| 青浦区| 扎赉特旗| 无锡市| 长顺县| 芜湖市| 高唐县| 福建省| 玛纳斯县| 松滋市| 南康市| 永胜县| 开化县| 明水县| 望都县| 黄陵县| 商水县| 大丰市| 许昌县| 香河县| 常山县| 封丘县| 大化| 中方县|