日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

template_1

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 template_1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0:
模板是一些為多種類型而編寫的函數和類,而且這些類型都沒有指定。當使用模板的時候,只需要把所希望的類型作為一個(顯示或隱示的)實參傳遞給模板。模板是語言本身所具有的特效,她完全支持類型檢查和作用域。

并不是把模板編譯成一個可以處理任何類型的單一實體;而是對于實例化模板參數的每種類型,(編譯器)都從模板產生出一個不同是實體。
這種用具體類型代替模板參數的過程叫實例化(instantiation)。她產生一個模板的實例。

1:
如何試圖基于一個不支持模板內部所使用的操作的類型實例化一個模板,將會導致一個編譯期錯誤。
so,模板被編譯了兩次:a,實例化之前,先檢查模板代碼本身語法是否正確;b,在實例化期間,檢查是否所模板的有調用都有效。
這不同于普通函數中編譯與鏈接之間的區別,對于普通函數只要有聲明(不需要定義)就可以通過編譯。然而當使用函數模板并引發模板實例化的時候,編譯器需要查看模板的定義。

2:實參演繹deduction
template <typename T>//T是模板參數
inline T const& max (T const& a, T const& b)//a.b是調用參數
{
??? return a < b ? b : a;
}
如果傳遞兩個int給參數類型T const&,那么編譯器能夠得出結論:T必須是int。這里不允許進行自動類型轉換。

max(4, 5.6);
error MSB6006: “CL.exe”
error C2782: “const T &max(const T &,const T &)”: 模板 參數“T”不明確
解決error:
對實參強制類型轉換max(4, static_cast<int>4.2);
顯示指定T類型指定兩個不同類型參數。

inline T1 const& max (T1 const& a, ?T2 const& b)
對于指定兩個不同類型參數,由于該模板函數有返回類型,另個參數的實參可能要轉型為返回類型而不會在意調用者意圖;而且把另一個參數轉型為返回類型的過程將會創建一個局部臨時對象,所以返回類型必須是T1不能是T1 const& 。

因為調用參數(a,b)的類型構造自模板參數T,所有模板參數和調用參數通常是相關的。這個概念就叫實參演繹。
如max<double>(4, 4.2);用double實例化T,從而構造調用參數類型。

當模板參數和調用參數沒有發生關聯或不能由調用參數確定模板參數時,在調用時就必須顯示指定模板實參。
template <typename T1, typename T2, typename RT>
inline RT max (T1 const& a, ?T2 const& b);
模板實參演繹并不適合返回類型,因為RT不會出現在調用參數的類型里面,因此調用并不能演繹出RT。所以需要顯示指導模板實參列表。
max<int, double, double> max(4, 4.2);

如果改變模板參數的聲明順序就只需指定返回類型
template < typename RT , typename T1, typename T2,>
max<double>(4, 4.2);
因為必須顯示指定”最后一個不能被隱式演繹的模板之前的”所有實參類型,返回類型不能被演繹而調用參數可讓演繹過程推導出。

3:重載函數模板
int const& max(int onst& a, int const& b)
{return a<b?b:a; }

template<typename T>
inline T const& max(T const& a, T const& b)
{return a<b?b:a; }

template<typename T>
inline T const& max(T const& a, T const& b, T const& c)
{ max(max(a, b), c); }

max(7,4,5);//調用三參數的模板
max(4.2, 3.0);//調用max<double>(通過實參演繹)
max(‘a’, ‘b’);//調用max<char>(通過實參演繹)
max(3, 5);//調用int重載的非模板函數
max(3, 5.1);//調用int重載的非模板函數
max<>(3, 5);// 調用max<int>(通過實參演繹)
max<double>(3, 5);// 調用max<double>(沒實參演繹)

轉載于:https://www.cnblogs.com/liuhan333/p/5705962.html

總結

以上是生活随笔為你收集整理的template_1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。