C 新標準 侯捷(二) 語言(中)

2021-09-10 15:52:58 字數 1512 閱讀 9713

可以讓編譯器找出乙個表示式的型別,相當於typeof特性。

mapcoll;

decltype(coll)::value_type elem;//map::value_type elem;

1.用來宣告返回型別,比如:

templatedecltype(x+y) add(t1 x,t2 y);//因為這時還沒讀入x,y所以改為

auto add(t1 x, t2 y)->decltype(x+y);//與lambdas很像

2.適用於metaprogramming(這裡指的是在模板裡的各種運用)

typedef typename decltype(obj)::iterator itype;

因為這裡有:: ,所以這裡要加typename,告訴編譯器這是個型別名字。

3.通過乙個lambda表示式,就是得到乙個lambda表示式的型別,即是乙個物件的型別。比如:

auto cmp = (const person& p1,const person& p2);看有沒有引數,小括號就可以不寫。

auto i =

例1是前面的列印一串混合型別的數,例2是重寫c語言中的printf,較前者更加複雜,但並無新意,也即略去。

若處理型別相同,個數不限的狀態,initializer_list足矣。

例4.不再借用initializer_list,即不用{},更一般的介面。和前面的分解遞迴相同。 

例5. 類模板,以異於一般的元素處理first元素和last元素,即有一定格式。

max是不會變的。不斷地建立物件。

例6.遞迴繼承(實現tuple)

1.乙個拿來建立乙個成員資料,剩下的又形成乙個tuple繼承於這個tuple,一直往上繼承,直到空的類。

2.尾部的函式傳回自己並轉型成inherited,也就是tuple

3.因為inherited(vtail...)在初始化引數裡,所以並非是型別+()建立臨時物件,因此是呼叫父類的建構函式。

4.typename head::type編譯不通過,該怎麼改呢?由於編譯器順著編,所以宣告成員要拿上去。而且要返回得先獲得,所以用->。

auto head()->decltype(m_head)

其實改為head head()就可以了233333333。

例7.遞迴復合——內含乙個類,而不是繼承

composited要是引用,因為需要修改它。

C 新標準 侯捷(三) 標準庫

之所以放在標準庫,是因為它雖是語言的部分,但接下來的東西都與標準庫有關。可以幫忙解決不必要的copy。當賦值右邊是乙個右值時,左邊的物件可以偷右邊物件的資源。lvalue 可以出現於operator 左側者 rvalue 只能出現於operator 右側者。我們試驗發現,整數中a b 42是不可以的...

侯捷 C 標準11 14

本篇記錄學習 侯捷 c 標準11 14 一 演進 環境與資源 1 c 2.0的新特性,包括語言的部分和標準庫的部分。tr1是2003年的版本,即c 1.0。二 variadic templates 1 數量不定的模板引數,引數個數和引數型別都未定。三 spaces in template expre...

C 11新特性 侯捷 課程筆記 二

本部分包括的內容為variadic templates 可變模板引數 這部分似乎是個概述,我看到後面有好幾節課也是這個主題。void print template 這裡的.是關鍵字的一部分 void print const t firstarg,const types args 這裡的.要寫在自定義...