C 11讀書筆記 2(新模板)

2021-07-15 20:08:44 字數 2229 閱讀 8912

c++98標準中不支援函式模板的預設模板引數。在c++11之前的版本,型別推導很差。而型別推導的大爆發在c++11上面有很大進步。

注意 預設引數必須是「從右往左」原則

templatevoid f(t1 a = 0,t2 b = 0) {}

int main()

但是這樣就不行了,原因是有些些情況不能用:

template//這樣寫不行

void f(t1 a = 0,t2 b = 0) {}

int main()

外部模板與外部變數的道理一樣。多個cpp檔案include相同模板**後,會產生大量的相同**冗餘。

只要乙個cpp檔案有宣告過template void fun(int);其他檔案可以直接用extern template void fun(int);

但是這有又有乙個坑。在用extern template void fun(int);之前。你怎麼知道存在有乙個檔案這麼寫template void fun(int);

注意外部模板宣告不能用靜態的。

書上說

#include using namespace std;

templatevoid f(t t){};

struct a; //匿名型別

int main()b;//區域性型別

f(a); //98不行,11可以

f(b); //98不行,11可以

return 0;

}

但經我驗證c++0x就可以這樣做了。不是c++11特有的東西。

這裡用using關鍵字代替typedef。算是小改動。但是會有一些更加靈活地功能。

templateusing mapstring = std::map;

mapstringnumberedstring;

千呼萬喚始出來的。上一節說了變長巨集。那是c的債務,c++的債務自然是變長引數模板

用...做變長引數,其實在c語言時代就已經有了,非c++11特有請看下面**

#include#include double sumofdouble (int count,...)

int main()

輸出為3.6。這裡...必須放在最後。

這麼寫最要命的是型別沒有傳遞進去。這樣其實非常不規範,而且不安全。vs自己用__crt_va_arg,__crt_va_start,__crt_va_end來替換。(g++沒有)

前提說明:

1.函式引數包,必須唯一,且在最後。否則會報可變引數不在最後的錯誤。反而模板引數包其有時不能,如下面,因為可以推導,說實話這情況如果使用不善很容易報錯。

template<

templateclass a, typename ... b,

templateclass c, typename ... d,

>

2.這麼寫typename ... t ,t... args ,三個點在引數前邊叫引數包。而 t... ,三個點在後面是包擴充套件或叫解包,是上乙個逆操作。

templateclass son: private father{};

變長模板按照遞迴繼承的方式實現,tuple可以看為標準的變長模板。遞迴繼承自然有遞迴初始化,遞迴規則,遞迴出口。書上的**是這樣的,這是乙個類python的list列表

templateclass list;//遞迴初始化

templateclass list:private list{};//遞迴規則

template<>

class list<>{};//遞迴推出

在書上我還看見了一種非型別模板,人家模板裡放型別,他直接放引數。

templatestruct multiply{};

用multiply<12,3,4> 這樣的方式就行不用像vector

解包的很多事情與引數包不同。我們可以不必將其放在最後。如,f(1,2,3,args...,5,6);如果實引數溢位也沒關係,從左往右賦值。sizeof...(t)可以得到t型別的可變變數的長度。。事實上很多地方都可以用包擴充套件。

表示式,初始化列表,基類描述列表,類成員初始化列表,模板引數列表,通用屬性列表,lambda函式捕捉列表。特點就是列表存在的地方,合理就可以。

C 11 新特性解析與應用》 讀書筆記

cplusplus 其實被定義為乙個整數 c 03 中被定義為199711l c 11 中被定義為201103l 可以通過下面的 檢測編譯器是否支援c 11 if cplusplus 201103l error should use c 11 implementation endif 列舉的作用域即...

C 11特性 《深入理解C 11 讀書筆記

新增關鍵字 struct alignas 32 colorvector 沒有alignas關鍵字的話,對齊到8位,加上的話,對齊到32位,能提公升效率。對齊的資料在讀寫上會有效能上的優勢。比如頻繁使用的資料如果與處理器的快取記憶體器大小對齊,有可能提高快取的效能。而資料不對齊可能造成一些不良的後果,...

c primer讀書筆記之c 11(三)

class ctordfttype 使用 default限定符的建構函式,不需要實現,編譯器會自動生成預設的函式實現。如果需要禁止類物件間的複製或者賦值,傳統的做法是將複製建構函式和賦值運算子設定為private。c 11提供了的 delete限定符用於實現類似的功能,delete限定符可用於任何函...