跟我學(xué)c++中級(jí)篇——decay-創(chuàng)新互聯(lián)

一、類型的萃取

在前面分析過類型的萃取,說的直白一些就是得到某些表達(dá)式或者變量的類型。這個(gè)如果在普通的編程里沒啥難度,但在模板編程里或者一些特殊情況下就比較麻煩了,畢竟c++還是一門看上去高級(jí)其實(shí)仍然有些低級(jí)的語言(沒有RTTI,Run-Time Type Identification)。這個(gè)結(jié)果就是c++沒有辦法從設(shè)計(jì)上得到運(yùn)行期的類別類型。但是有困難壓不領(lǐng)到英雄漢,在c++中還是有辦法得到這些類型的,最典型的方法就是萃取。這個(gè)在前面介紹過,可以回頭翻翻一下前面的公眾號(hào)。
在c++中,其實(shí)有些情況下并不需要純粹的獲得這個(gè)類型的情況,比如CV限制等等可以不用考慮,那么在c++的庫中,還是提供一些其它的獲取類型的方式,下面介紹的std::decay就是如此,它定義在頭文件中。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比膠州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式膠州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋膠州地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。二、標(biāo)準(zhǔn)庫中的std::decay

看一下定義:

template< class T >struct decay;          (C++11 起)
對類型 T 應(yīng)用左值到右值、數(shù)組到指針及函數(shù)到指針隱式轉(zhuǎn)換,移除 cv 限定符,并定義結(jié)果類型為成員 typedef type 。正式而言:

若 T 指名“ U 的數(shù)組”或“到 U 的數(shù)組的引用”類型,則成員 typedef type 為 U* 。
否則,若 T 為函數(shù)類型 F 或到它的引用,則成員 typedef type 為std::add_pointer::type 。
否則,成員 typedef type 為 std::remove_cv::type>::type 。
這些轉(zhuǎn)換模仿在以值傳遞時(shí),應(yīng)用到所有函數(shù)參數(shù)的類型轉(zhuǎn)換。
添加 decay 的特化的程序行為未定義。

成員類型
名稱	定義
type	應(yīng)用退化類型轉(zhuǎn)換到 T 的結(jié)果

其實(shí)這上面的說明就很好的解釋了剛剛的情況,也就是說,這是可能會(huì)引起退化的操作,它會(huì)移除cv限定符并將數(shù)組退化為指針并消除引用(指針特性除外,如果想移除可使用std::remove_pointer)。type其實(shí)更詳細(xì)的解釋就是:T是引用類型,decay::type返回T引用的元素類型;當(dāng)T是非引用類型,decay::type返回T的類型。

三、例程

看一下相關(guān)例程:

#include#includetemplatestruct decay_equiv : 
    std::is_same::type, U>::type 
{};
 
int main()
{
    std::cout<< std::boolalpha
   << decay_equiv::value<< '\n'
   << decay_equiv::value<< '\n'
   << decay_equiv::value<< '\n'
   << decay_equiv::value<< '\n'
   << decay_equiv::value<< '\n'
   << decay_equiv::value<< '\n';
}

這個(gè)程序的運(yùn)行結(jié)果全是True。再回頭對比一下相關(guān)的定義,就明白了。其實(shí)配合著上面提到的std::add_pointer和std::remove_pointer就可以實(shí)現(xiàn)把指針也退化掉的情況,根據(jù)工作中的實(shí)際應(yīng)用來處理吧。其實(shí)這個(gè)東西單純用在普通程序里意義不是多大。更多還是用在模板編程上??聪旅娴睦樱?/p>

templatestatic void MyFunc(Data& d, T&& s)
    {
        using U = typename std::decay::type;
        if (sizeof(U)<= size)
            new ((U*)&d) U(std::forward(s));//new定位運(yùn)算,即從指定的內(nèi)存位置分配
        else
            *(U**)&d = new U(std::forward(s));
    }
四、總結(jié)

不要小看每個(gè)小的細(xì)節(jié)的應(yīng)用,這些應(yīng)用一旦組合起來,可能產(chǎn)生一種無法想象的威力,這也是c++的魅力所在。如果在看一些開源框架中有些代碼一看就頭大時(shí),不要害怕,把它拆開來分解學(xué)習(xí),很快就明白他們的用處。如果無法全新的創(chuàng)新,那么組合的創(chuàng)新也不失為一種技術(shù)的進(jìn)步。
打好基礎(chǔ),緊跟技術(shù)前進(jìn)的腳步,這才是學(xué)好c++的前提。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞標(biāo)題:跟我學(xué)c++中級(jí)篇——decay-創(chuàng)新互聯(lián)
分享地址:http://muchs.cn/article0/coecio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司面包屑導(dǎo)航、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)