普通(非模板)類的成員模板
我們設計乙個類,包含乙個過載的函式呼叫運算子,它接受乙個指標並對此指標執行delete。與預設刪除器不同,我們還在刪除器被執行時列印一條資訊。
class debugdelet
//與任何函式模板一樣,t的型別有編譯器推斷
template
void
operator()(t *p) const
private:
std::ostream os;
};double *p = new
double;
debugdelete d; //可像delete表示式一樣使用的物件
d(p); //呼叫debugdelete::operator()(double*),釋放p
int* ip = new
int;
//在乙個臨時debugdelete物件上呼叫operator()(int*)
debugdelete()(ip);
//也可以將debugdelete用作unique_ptr的刪除器。
unique_ptr p(new
int, debugdelete());
這裡傳入unique_ptr的刪除器還可以用函式,
void debugdelete2(double *d)
unique_ptr
以blob為例,我們為blob類定義乙個建構函式,它接受兩個迭代器,表示要拷貝的元素的範圍。
template
class blob;
在類的外部定義時,必須同時提供類模板和函式模板的模板引數列表。
template
//類模板的引數
template
blob::blob(it b,it e):data(std::make_shared>(b,e)){}
在大系統中,在多個檔案中例項化相同模板的開銷可能非常嚴重。在新標準中,我們可以通過顯示例項化(explicit instantiation)來避免這種開銷。
extern
template declaration; //例項化宣告
template declaration; //例項化定義
declaration是乙個類或函式宣告,其中所有模板引數已被替換為模板引數。例如,
//例項化宣告與定義
extern
template
class blob; //宣告
template
int compare(const
int&, const
int&); //定義
extern宣告就表示承諾會在程式其他位置有該例項化的乙個非extern宣告(定義)。
//這些模板型別必須在程式的其他位置進行例項化
extern
template
class blob;
extern
template
int compare(const
int&, const
int&);
blob sa1,sa2; //例項化會出現在其他位置
//blob及其接受initializer_list的建構函式將在本檔案中例項化
blob a1=;
blob a2(a1); //拷貝建構函式在本檔案中例項化
int i = compare(a1[0],a2[0]); //例項化出現在其他位置
//例項化檔案必須為每個在其他檔案中宣告為extern的型別和函式提供乙個(非extern)的定義
template
int compare(const
int&,const
int&);
templalte class blob; //例項化模板的所有成員
與類模板成員函式的例項化不同(乙個類模板的成員函式只有在使用到它時才進行例項化,這一特性使得即使某種型別不能完全符合模板操作的要求,我們依然能用該型別例項化類)。乙個類模板的例項化定義會例項化所有成員。 C 模板與泛型程式設計
1 物件導向程式設計總是以顯式介面和執行時多型解決問題。模板及泛型世界不同,在此世界中顯式介面和執行時多型仍然存在,但重要性降低,反倒是隱式介面和編譯器多型移到前頭。執行時多型和編譯時多型 前者表示哪乙個虛函式該被繫結,後者表示哪乙個過載函式該被呼叫。顯式介面由函式的簽名式 函式名稱 引數型別 返回...
模板與泛型程式設計
模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...
模板與泛型程式設計
泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...