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

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

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

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

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

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

從一個例子入手

首先,我們看如下例子:

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

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

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

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

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

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

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

用例

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

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

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
}

顯然,代碼更加簡潔統(tǒng)一。

限制

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

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

return0;
}

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

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

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

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

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

return0;
}

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

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

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

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

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

以上~~

審核編輯:黃飛

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

    關(guān)注

    0

    文章

    275

    瀏覽量

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

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73301
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48894

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

文章出處:【微信號:CPP開發(fā)者,微信公眾號:CPP開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Labview提示用戶輸入示例

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

    excel vba代碼 示例講解

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

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

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

    MSP430系列用戶指導(dǎo)和示例代碼

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

    python代碼示例基于Python的日歷api調(diào)用代碼實例

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

    AD593X代碼示例

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

    BeMicro代碼示例

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

    ezLINX?示例PC應(yīng)用程序源代碼

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

    機器學(xué)習(xí)必學(xué)的Python代碼示例

    機器學(xué)習(xí)必學(xué)的Python代碼示例
    發(fā)表于 06-21 09:35 ?14次下載

    華為游戲服務(wù)示例代碼教程案例

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

    基于keil的AD7366示例代碼

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

    RAA489204 示例代碼軟件手冊

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

    RAA489204 示例代碼軟件手冊

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

    安全驅(qū)動示例代碼和實現(xiàn)

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

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

    Q A 問: Arduino Uno的函數(shù)示例 我決定自己編寫函數(shù)示例代碼,因為這應(yīng)該是Arduino中的基本示例。網(wǎng)絡(luò)上確實有關(guān)于使用函數(shù)的文檔,但是,如果要嘗試使用
    的頭像 發(fā)表于 11-16 16:05 ?404次閱讀
    自己編寫函數(shù)<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>很難嗎?分享幾個<b class='flag-5'>示例</b>!