C 模板與泛型程式設計(3)

2021-07-05 02:15:34 字數 2118 閱讀 9950

普通(非模板)類的成員模板

我們設計乙個類,包含乙個過載的函式呼叫運算子,它接受乙個指標並對此指標執行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 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...