哪個(gè)協(xié)會(huì)要做網(wǎng)站建設(shè)啊優(yōu)化網(wǎng)站快速排名軟件
文章目錄
- 前言
- 它們是什么
- 通俗解釋
- 總結(jié)
前言
在C++中提到推導(dǎo)第一個(gè)映入腦海的可能是“模板”,當(dāng)然有人也可能想到 auto
,這些都是和推導(dǎo)相關(guān)的語言語法,再比如“完美轉(zhuǎn)發(fā)”等等,總是就是他們的類型不用明明白白的寫出來,可以利用一種簡(jiǎn)單的方式來定義,比如 candidates
是一個(gè)字符串?dāng)?shù)組, 如果遍歷它我們可以寫成 for (auto& skillId : candidates)
,而不用將 skillId
變量定義成 const std::string&
,這在一定程度上帶來了便利,今天的幾個(gè)東東也是用于推導(dǎo)的,我們一起來看看。
它們是什么
decltype
、std::declval
和 std::decay_t
都是 C++ 標(biāo)準(zhǔn)庫中的類型相關(guān)工具,這些工具在 C++ 編程中提供了強(qiáng)大的類型推導(dǎo)和處理能力,使得代碼更加靈活。
-
decltype
是一個(gè)關(guān)鍵字,用于從一個(gè)表達(dá)式中推導(dǎo)出其類型。它通常與表達(dá)式一起使用,以便在編譯時(shí)確定表達(dá)式的類型。例如:int x = 5; decltype(x) y = 10; // y 的類型將被推導(dǎo)為 int
decltype
還可以用于推導(dǎo)函數(shù)返回類型,以及在泛型編程中處理模板的類型。 -
std::declval
是一個(gè)函數(shù)模板,用于在不實(shí)際調(diào)用構(gòu)造函數(shù)的情況下生成一個(gè)對(duì)象引用,以便在類型推導(dǎo)中使用。通常在需要引用某個(gè)類型的對(duì)象但實(shí)際無法創(chuàng)建該對(duì)象的上下文中使用,例如在函數(shù)返回類型推導(dǎo)中:template <typename T> auto createAndProcess() -> decltype(std::declval<T>().process()) {// 此處只是用于類型推導(dǎo),并不會(huì)實(shí)際創(chuàng)建 T 的對(duì)象 }
在這個(gè)例子中,
std::declval<T>().process()
用于推導(dǎo)函數(shù)的返回類型,但并不會(huì)實(shí)際調(diào)用process
函數(shù)。 -
std::decay_t
是一個(gè)類型轉(zhuǎn)換工具模板,用于將給定類型的"衰變"后的類型返回。衰變指的是將類型轉(zhuǎn)換為其"自然"形式,即去掉引用、添加 cv 限定符(const 和 volatile)。例如:using T1 = std::decay_t<int&>; // T1 為 int using T2 = std::decay_t<const int>; // T2 為 int using T3 = std::decay_t<int[]>; // T3 為 int*
std::decay_t
在模板編程中很有用,因?yàn)樗梢詭椭コ愋偷亩嘤嘞薅ǚ?#xff0c;使得函數(shù)模板的匹配更加精確。
通俗解釋
如果看了上面的例子還是有點(diǎn)迷糊,那我再解釋的通俗一點(diǎn):
-
decltype
讀音為 “dee-kluh-type”,就是返回一個(gè)變量的類型,比如你有一個(gè)對(duì)象obj
想要再定義一個(gè)和它相同各類型的變量就可以寫成decltype(obj) newObj;
-
std::declval
讀音為 “standard dee-cl-val”,它能返回類型 T 的右值引用,其實(shí)是一個(gè)偽實(shí)例,不會(huì)產(chǎn)生任何臨時(shí)對(duì)象,也不會(huì)因?yàn)楸磉_(dá)式很復(fù)雜而發(fā)生真實(shí)的計(jì)算。因?yàn)椴粫?huì)真正的進(jìn)行構(gòu)造,所以可以實(shí)現(xiàn)在元編程時(shí)偽構(gòu)造一個(gè)沒有定義默認(rèn)構(gòu)造函數(shù)類,還可以避開純虛基類不能實(shí)例化的問題,說白了它就是假裝創(chuàng)建個(gè)對(duì)象用于推導(dǎo)類型。 -
std::decay_t
讀音為 “standard dee-kay tee”,有點(diǎn)褪去外表直擊內(nèi)心的意味,就是大家一起褪去花里胡哨的修飾符,獲得原始的類型,用于函數(shù)模板的匹配更加精確,比如判斷類型T
是不是int,if constexpr (std::is_same_v<std::decay_t<T>, int>)
總結(jié)
decltype
是關(guān)鍵字,用于有了值或?qū)ο笄箢愋偷?/li>std::declval
是函數(shù)模板,用于偽造一個(gè)對(duì)象但不實(shí)際構(gòu)造的std::decay_t
是類模板,用于去除修飾符獲取原始類型的- 沒想到
decltype
居然是關(guān)鍵字,結(jié)果一查發(fā)現(xiàn)C++的關(guān)鍵字已經(jīng)膨脹了,下次總結(jié)一下
當(dāng)身邊出現(xiàn)不和諧聲音的時(shí)候問問自己,是不是你把他們招來的,用實(shí)力讓他們閉嘴,而不要視圖通過語言讓他們明白