原創 2023年06月22日 01:48:22
本次學習3個知識點:
(1)auto推導型別
(2)decltype推導表示式的型別
(3)返回型別後置語法
泛型程式設計中經常遇到的寫乙個加法函式:
template
r add(t t, u u)
int a = 10;
float b = 20.0;
auto c = add(a, b);
這裡我們並不關心a+b結果的型別,故使用decltype推導返回值型別。這個add函式有沒有改進方法,畢竟既然外部不知道add內部是怎麼操作的、返回的結果應該是什麼型別。
根據這個想法,我們把上述例子改進為:
template
decltype(t + u) add(t t, u u)
邏輯上沒有問題,返回型別由decltype推導,但是無法編譯通過,原因是c++的返回值是前置語法,在返回值定義的時候引數變數還不存在,這裡會提示t、u尚未定義。
既然如此,那我們把decltype中的表示式稍微改進一下,以便編譯通過
template
decltype(t() + u()) add(t t, u u)
但t、u可能是沒有無引數的建構函式的類,利用乙個小技巧:0(或null)可以轉換成任意型別指標,改進為正確版本:
template decltype((*(t*)
0) + (*(u*)
0)) add(t t, u u)
功能無誤、編譯正確,但有點複雜,一點都不「c++11」。這裡要用到上面講的第3個知識點:返回型別後置語法,將decltype和auto結果起來完成返回值型別的推導,
template
auto add(t t, u u) -> decltype(t + u)
是不是特別簡潔~
初次看上述**,可能有乙個疑問就是會不會(t + u)會運算兩次,影響「效能」。絲毫不會,原因是decltype推到表示式型別是在編譯期完成的,並且不會真正計算表示式的值,型別sizeof推導表示式型別大小一樣。
【參考:祁宇《深入應用c++11**優化與工程級應用》】
14 C 11返回型別後置語法的使用
c 11新標準增加的auto不僅可以自動推斷變數型別,還能結合decltype來表示函式的返回值。這些新特性可以讓我們寫出更簡潔 更現代的 在泛型程式設計中,可能需要通過引數的運算來得到返回值的型別。我們看一下下面這個例子 includeusing namespace std template r ...
C 11語法auto推導返回
c 不允許直接推導auto返回型別,如果要用auto返回型別,需要用decltype 宣告尾返回型別 如下面 template auto add a x,b y decltype x y 呼叫方式還是和普通的模板元函式一樣 std cout add 5,8 std endl std cout add...
C 11 FAQ中文版 返回值型別後置語法
二28 year 2011 陳 良喬 c 11 faq 返回型別後置語法 考慮下面這段 template?mul t x,u y 函式mul 的返回型別要怎麼寫呢?當然,是 x y型別 但是這並不是乙個資料型別,我們如何才能一開始就得到它的真實資料型別呢?在初步了解c 0x之後,你可能一開始想到使用...