隨著章節內容的深入,難度逐漸上升。為了保障學習品質,從這個篇章開始將放慢閱讀速度,希望能仔細消化每一個重要觀念!
Class 與 template 的「介面」與「多型」皆存在,但表現形式不同。對 class 來說介面是顯式的,基於函式簽名,支援執行時多型;對 template 來說介面是隱式的,基於有效表達式,支援編譯時多型。
隱式介面不會有明確的標註或定義。開發者在使用這樣的介面時,需要根據具體情況來推斷其實現或功能。
用以下模板函數舉例。模板參數中的 Student
並不是一個具體的類型,而是一個通用的占位符。
template<typename Student>
void doExam(Student& s) {
// implement here...
}
而在 doExam
被實際調用時,會被具體化為 doExam(Yoyo&)
,並接受一個 Yoyo&
類型的參數:
Yoyo y;
doExam(y);
typename
「巢狀依賴型別」是指那些依賴於模板參數的型別名稱,例如 C::const_iterator
等。其需要使用 typename
避免歧義,讓編譯器確定該語法是型別而非其他元素。
而以下幾種情況並不需要 typename
:
typedef
簡化巢狀型別名稱,常見於泛型程式設計。class
和 typename
可互換。