天天看點

C++ Primer 學習筆記_78_模闆與泛型程式設計 --執行個體化[續]模闆與泛型程式設計

二、函數模闆的顯式實參

在某些情況下,不可能推斷模闆實參的類型。當函數的傳回類型必須與形參表中所用的所有類型都不同時,最常出現這一問題。在這種情況下,有必要覆寫模闆實參推斷機制,并顯式指定為模闆形參所用的類型或值。

1、指定顯式模闆實參

如果函數形參類型不統一,該如何指定sum的傳回類型?

此時使用任一形參調用都一定會在某些時候失敗:

可以強制sum的調用者将較小的類型強制轉換為希望作為結果使用的類型來解決此問題:

2、在傳回類型中使用類型形參

指定傳回類型的一種方式是引入第三個模闆形參,它必須由調用者顯式指定:

有一個問題:沒有實參的類型可用于推斷T1的類型,相反,調用者必須在每次調用sum時為該類型顯式提供實參。

這一調用顯式指定T1的類型,編譯器從調用中傳遞的實參推斷T2,T3的類型。

【小結】

顯式模闆實參從左至右與對應模闆形參相比對,假如可以從函數形參推斷,則隻有結尾(最右邊)形參的顯式模闆實參可以忽略。

如果這樣編寫sum函數:

則總是必須為所有三個形參指定實參:

3、顯式實參與函數模闆指針

可以使用顯式模闆實參的另一個例子是第16.2.1節中有二義性程式,通過使用顯式模闆實參能夠消除二義性:

像前面一樣,需要在調用中傳遞compare執行個體給名為func的重載函數。隻檢視不同版本func的形參表來選擇傳遞compare的哪個執行個體是不可能的,兩個不同的執行個體都可能滿足該調用。顯式模闆形參需要指出應使用哪個compare執行個體以及調用哪個func函數。

繼續閱讀