1.template引數定義中,typename 和class 可以互換,盡量使用typename,不可以使用struct
2.模板引數可以使用任意型別,包括內建型別,自定義類,列舉等
3.模板引數名稱可以使用任意名稱
4.函式模板不是只編譯乙份滿足多重需要,而是為每一種例項化型別編譯乙份
5.只有函式模板的使用才會引發例項化
6.為某種型別例項化模板,而此型別不完全支援模板內使用的操作會引發編譯錯誤
7.每種模板會編譯兩次:1.如果沒有使用者請求例項化則只做語法檢查
2.當使用者請求例項化時,模板進行檢查確保所有的呼叫都有效
2.2 實參推演
1.函式模板根據傳遞的引數型別進行推演
2.自動型別轉換不被允許 解決方法:1.顯式指定型別
2.cast
3.使用多引數模板
2.3 模板形參
1.函式模板有兩種引數 1.模板形參,宣告在函式名字前的尖括號裡 template
2.呼叫形參,宣告在函式名後面的圓括號裡 set(t value)
2.類模板可以設定預設模板實參,函式模板不可以
3.可以使用任意數量的模板引數
4.模板引數之間進行轉換可能會產生臨時物件導致不能返回引用
5.呼叫形參和模板形參之間的關係叫做函式模板實參推演6.可以顯式地指定引數型別,而當呼叫形參和模板形參之間沒有關係或者模板形參不能被決定的話,必須顯式地指定引數型別
7.模板實參推演不進行返回值匹配
8.可以部分地顯式指定不能通過推演得到的模板引數(放在template<>開始部分)
2.4 過載函式模板
1.普通(非模板)函式過載過程:
注意: 1.通過函式指標和指向成員函式的指標呼叫的函式不參與過載決定過程
因為它們是在執行時刻通過指標決定呼叫的 [page]
2.類函式巨集不參與過載決定過程
1.查詢函式名構造過載集合
2.集合裡的函式盡量以各種方式進行變換,例如引數推演,隱式轉換等以便匹配呼叫
3.變換完成後不能匹配的被從集合裡面刪除,剩下的構成乙個可行函式候選集合
4.進行最優匹配,如果找到最優的,選中它;如果沒有最優的,則此呼叫是不明確的
5.檢查選中的函式。如果是類似於私有成員函式這種不能到達的,那麼發出乙個警告
*其中4:
1.完美匹配 引數型別和表示式一致,或提及到表示式型別比如加const/volatile限定符
2.次要調整後匹配:比如陣列變數退化成指標,或給型別新增const等
3.提公升後匹配 把小整型(bool char short)轉化成int long uint ulong, float 轉化成double等
4.標準轉換後匹配 比如int到float,不包括對於轉換操作符或轉換建構函式的隱式呼叫
5.使用者定義轉換後匹配 允許任何隱式轉換
6.加上省略號後匹配 基本可以匹配任何型別,但是non-pod class 會導致未定義行為
省略一部分
過載細節: 1.非模板函式優於模板函式例項(不管是產生自一般例項還是顯式特化)
2.特化地更多的模板例項優先
轉換順序: 上述*處的反向轉換
省略一部分
2.過載函式模板
1.非模板函式可以和函式模板名字相同,型別和返回值相同
2.其他條件相同, 非模板函式優於模板函式例項
3.空模板引數呼叫函式要求使用模板函式例項,且所有型別都要從實參中推演出來
4.模板引數不允許型別轉換
5.多引數函式模板各引數之間轉換可能會產生臨時物件
6.確保所有過載的函式模板都在被呼叫之前可見
2.5 總結
函式模板定義一系列帶有不同模板引數的函式
傳遞引數給模板的時候,函式模板才被例項化
可以顯式指定模板引數
可以過載模板引數
過載函式模板時,使用顯式指定來限制改變
確保所有過載的函式模板在被呼叫之前都可見
c 函式模板基礎
1.為什麼會有函式模板 includeusing namespace std 函式的業務邏輯一樣,函式的引數型別不一樣,比如說交換變數的值,變數可以是int型別,也可以是char型別,還可以是double型別 void myswap01 int a,int b void myswap02 char ...
C 基礎 函式模板
模板用於生成不同的東西 函式或者類 在c 中有函式模板和類模板。場景 當我們需要自己實現print函式時,怎麼處理傳入引數型別 double int char,short string 不同的情況呢?函式過載 這意味著你至少要寫兩個以上的函式區支援你的引數型別和個數的變化,而且這種方法不支援擴充套件...
C 基礎 模板基礎與函式模板
求兩個int float char型別的資料的最大值 c裡面要這樣寫 int maxint int x,int y double maxdouble double x,double y char maxchar char x,char y c 使用函式過載 多個同名函式處理多種型別資料的語法現象 可...