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限定符可用於任何函...