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

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

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

3天內不再提示

【ModernCpp】新特性之CTAD代碼示例

CPP開發者 ? 來源:騰訊云計算 ? 2023-12-20 14:00 ? 次閱讀

最近在閱讀C++ Templates 2nd,發現有些很有意思的新特性,今天,借助本文,分享給大家。

從一個例子入手

首先,我們看如下例子:

template
classAdd{
public:
Add(Tfirst,Tsecond):first_{first},second_{second}{}
Tresult()const{returnfirst+second;}
private:
Tfirst_;
Tsecond_;
};

這個例子很簡單,聲明一個模板類Add,接收類型為T的構造函數Add,以及一個返回operator+結果的result()函數。

在c++17之前,如果我們要使用Add類,往往必須像如下這么做:

intmain(){
Addti(1,2);
return0;
}

即在實例化對象ot的時候必須指明類型int。

自C++17起引入了新的特性Class Template Argument Deduction,簡稱為CTAD,即類模板參數推導,那么就可以像如下這樣實例化ADD類:

intmain(){
Addti(1,2);//T被推導為int
Addtd{1.245,3.1415};//T被推導為double
Addtf={0.24f,0.34f};//T被推到位float
return0;
}

用例

上面的例子,我們已經體會到了CTAD帶來的好處(代碼間接),下面結合在項目中的用的例子更進一步的來說明CTAD。

相比我們都知道std::lock_guard類,其主要用了實現RAII功能,尤其在多線程環境中用的最多,如下:

std::mutexm;
std::recursive_timed_mutexrm;

voidfun1(){
std::lock_guardlg{m};
//dosth
}

voidfun2(){
std::lock_guardlg{rm};
//dosth
}

在C++17,我們往往得像上面這樣寫,即需要顯式指定lock_guard的類型。但是,自C++17起,可以像如下這樣寫:

std::mutexm;
std::recursive_timed_mutexrm;

voidfun1(){
std::lock_guardlg{m};
//dosth
}

voidfun2(){
std::lock_guardlg{rm};
//dosth
}

顯然,代碼更加簡潔統一。

限制

雖然CTAD用起來很方便,但是相對于不使用CTAD特性,有時候CTAD會存在一些問題,即編譯器推導的類型并不是我們所預期的,仍然使用第一節中的例子:

intmain(){
Addts("hello,","world!
");
autoret=ts.result();

return0;
}

在編譯階段,會報如下錯誤:

error:invalidoperandsoftypes'constchar*const'and'constchar*const'tobinary'operator+'
Tresult()const{returnfirst_+second_;}

即編譯器會將"hello "和"world! "推導成為const charconst,而c++的char是不支持operator+操作的,這就導致了上面的編譯錯誤。

此時,我們可以使用C++17之前的實例方法即顯示指明類型,如下:

intmain(){
Addts("hello,","world!
");
autoret=ts.result();

return0;
}

如果這樣做的話,多少有點失去了CTAD的好處,為了解決這種類似的問題,C++17支持顯示類型推導,即添加代碼:

Add(constchar*,constchar*)->Add;

需要注意的是,這一行類型推導需要加在類聲明之后,這樣編譯器在遇到參數為const cha*的時候,會自動將其推導為std::string.

這樣,我們的例子最后如下:

Add(constchar*,constchar*)->Add;
intmain(){
Addts("hello","world!
");
ts.result();
}

以上~~

審核編輯:黃飛

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

    關注

    0

    文章

    279

    瀏覽量

    20232
  • C++
    C++
    +關注

    關注

    22

    文章

    2116

    瀏覽量

    74535
  • 編譯器
    +關注

    關注

    1

    文章

    1651

    瀏覽量

    49718

原文標題:【ModernCpp】新特性之CTAD

文章出處:【微信號:CPP開發者,微信公眾號:CPP開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Labview提示用戶輸入示例

    Labview提示用戶輸入示例,很好的Labview資料,快來下載學習吧。
    發表于 04-19 11:17 ?0次下載

    excel vba代碼 示例講解

    excel vba代碼 示例講解
    發表于 09-07 09:36 ?25次下載
    excel vba<b class='flag-5'>代碼</b> <b class='flag-5'>示例</b>講解

    代碼編寫器Studio的新的和改進的特性詳細概述

    該應用說明描述了代碼編寫器Studio的新的和改進的特性。 (CCS)2并提供如何使用新功能的說明。這是利用使用代碼編寫器Studio 2裝運的現有示例
    發表于 04-25 15:08 ?1次下載
    <b class='flag-5'>代碼</b>編寫器Studio的新的和改進的<b class='flag-5'>特性</b>詳細概述

    MSP430系列用戶指導和示例代碼

    MSP430系列用戶指導和示例代碼
    發表于 05-08 09:42 ?28次下載
    MSP430<b class='flag-5'>之</b>系列用戶指導和<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>

    python代碼示例基于Python的日歷api調用代碼實例

    本文檔的主要內容詳細介紹的是python代碼示例基于Python的日歷api調用代碼實例。
    發表于 09-06 14:25 ?42次下載
    python<b class='flag-5'>代碼</b><b class='flag-5'>示例</b><b class='flag-5'>之</b>基于Python的日歷api調用<b class='flag-5'>代碼</b>實例

    AD593X代碼示例

    AD593X代碼示例
    發表于 03-23 08:18 ?14次下載
    AD593X<b class='flag-5'>代碼</b><b class='flag-5'>示例</b>

    BeMicro代碼示例

    BeMicro代碼示例
    發表于 05-10 12:21 ?0次下載
    BeMicro<b class='flag-5'>代碼</b><b class='flag-5'>示例</b>

    ezLINX?示例PC應用程序源代碼

    ezLINX?示例PC應用程序源代碼
    發表于 06-05 19:12 ?1次下載
    ezLINX?<b class='flag-5'>示例</b>PC應用程序源<b class='flag-5'>代碼</b>

    機器學習必學的Python代碼示例

    機器學習必學的Python代碼示例
    發表于 06-21 09:35 ?14次下載

    華為游戲服務示例代碼教程案例

    概述 游戲服務kit安卓示例代碼集成了華為游戲服務的眾多API,提供了示例代碼程序供您參考和使用,下面是對示例
    發表于 04-11 11:09 ?4次下載

    基于keil的AD7366示例代碼

    基于keil的AD7366示例代碼分享
    發表于 10-08 14:58 ?3次下載

    RAA489204 示例代碼軟件手冊

    RAA489204 示例代碼軟件手冊
    發表于 01-10 18:52 ?0次下載
    RAA489204 <b class='flag-5'>示例</b><b class='flag-5'>代碼</b>軟件手冊

    RAA489204 示例代碼軟件手冊

    RAA489204 示例代碼軟件手冊
    發表于 06-30 19:23 ?0次下載
    RAA489204 <b class='flag-5'>示例</b><b class='flag-5'>代碼</b>軟件手冊

    安全驅動示例代碼和實現

    示例代碼獲取和集成 本示例中的驅動只實現了對內存的讀寫操作,并提供了測試使用的TA和CA。 讀者可使用如下指令從GitHub上獲取到示例代碼
    的頭像 發表于 10-30 16:07 ?794次閱讀
    安全驅動<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>和實現

    自己編寫函數示例代碼很難嗎?分享幾個示例!

    Q A 問: Arduino Uno的函數示例 我決定自己編寫函數示例代碼,因為這應該是Arduino中的基本示例。網絡上確實有關于使用函數的文檔,但是,如果要嘗試使用
    的頭像 發表于 11-16 16:05 ?702次閱讀
    自己編寫函數<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>很難嗎?分享幾個<b class='flag-5'>示例</b>!
    主站蜘蛛池模板: 国产精品国产三级国产在线观看 | 99草精品视频 | 成人精品一区二区不卡视频 | 色多多网站在线观看 | 精品国产中文一级毛片在线看 | 欧美一区二区三区综合色视频 | 色多多在线免费观看 | 92香蕉视频| 午夜老司机永久免费看片 | 日韩免费观看的一级毛片 | 成人国产精品2021 | 美女视频黄的免费视频网页 | 亚洲高清色图 | 色天天综合色天天天天看大 | 中国性猛交xxxxx免费看 | 日韩一级片免费观看 | www.色.com| 2021色噜噜狠狠综曰曰曰 | 四虎永久免费地址在线网站 | 久久99精品国产麻豆宅宅 | 狼色视频在线观免费观看 | 东北老女人啪啪对白 | 成年人网站在线 | 亚洲一区中文字幕在线观看 | 国产成人亚洲毛片 | xxxx日本黄色 | 精品成人在线 | 欧美性猛交aa一级 | 国模啪啪一区二区三区 | 久操青青 | 全部免费特黄特色大片农村 | 久久久久九九精品影院 | 欧美视频精品在线 | 亚洲天堂资源网 | 狠狠色丁香六月色 | 特黄特黄特色大片免费观看 | 7777色鬼xxxx欧美色夫 | 精品久久久久久国产免费了 | 视频一区二区三区在线观看 | 巨乳色在线观看 | 亚洲人成在线精品 |