C Templates學習筆記 例項化

2021-09-30 01:23:33 字數 1978 閱讀 3232

一:on-demand例項化

有時候也被稱為隱式例項化或者自動例項化。

on-demand例項化表明:在使用模板(特化)的地方,編譯器通常需要訪問模板和某些模板成員的整個定義。

例子:

templateclass c;//前置宣告

c* p = 0;//正確,因為這裡不需要知道c的定義

template class c

;void g(c& c)//只是用宣告

c* p2 = new c;

二:延遲例項化

例子:

#include #include #include #include "ctemplates.h"

using namespace std;

template class safe

;template class danger

;template class tricky

void no_body_here(safe= 3);

void inclass()

//void error()

//void unsafe(t (*p)[n]);

t operator->();

//virtual safesuspect();

struct nested

; union ;

};int main()

注: 

1.在檢查涉及模板引數的約束時,編譯器會假設引數處於最理想的情況。

2.替換tricky模板引數,用int替換t,0替換n,這裡不需要tricky中所有成員的定義,但預設建構函式和析構函式定義必須存在,還需要提供虛擬成員的定義。

三:c++的例項化模型

模板例項化:根據相應的模板實體,適當地替換模板引數,從而獲得乙個普通類或者函式。

1.兩階段查詢

依賴型名稱和非依賴型名稱

第一階段發生在模板的解析階段 第二階段發生在模板的例項化階段

第一階段: 使用普通查詢或者adl對模板進行解析時,就會查詢非依賴型名稱。非受限的依賴型名稱也會進行部分查詢。

第二階段: 我們稱此時例項化的地點為乙個例項化點poi。 依賴型受限名稱在此階段進行查詢(在運用模板實參代替模板引數之後獲得的特定例項化體中查詢)。另外,非受限的依賴型在此階段也會再次執行adl查詢。

2.poi

poi是位於源**中的乙個點,在該點會插入替換後的模板例項。

例如:

class myint ;

myint operator - (myint const&);

bool operator > (myint const&, myint const&);

typedef myint int;

template void f(t i)

}//1

void g(int)

//4

2,3如果不能作為poi,因為::f(int)定義不能在這插入,而1與4處,1處g(int)是不可見的,4處是可見的,因此4是poi

我們把poi定義在包含這個引用的定義或宣告之後的最近名字空間域。

template class s

;//5

unsigned long h()

//8

如上,如果是類特化這個poi位置不一樣。在5處,因為sizeof(s)需要知道s的大小。

乙個翻譯單元通常會包含同個例項的多個poi,對於類模板例項而言,只有首個poi會被保留,對於非型別例項來說,所有的poi都會被保留。

大多數編譯器會延遲非內聯函式模板的例項化,直到翻譯單元末尾處,才進行真正的例項化。

3.包含模型和分離模型

注:關於分離模型(利用export 關鍵字 跨翻譯單元宣告定義 ,類似於extern)

4.幾種實現方案

1.貪婪例項化

2.詢問例項化

3.迭代例項化

5.顯式例項化

C Templates學習筆記(類模板)

類模板stack 是通過c 標準庫的類模板vector 來實現的,因此不需要自己實現記憶體管理 拷貝建構函式和賦值運算子。標頭檔案宣告 include include using namespace std template class stack 成員函式的實現 template void sta...

extjs學習筆記 實戰

閒了將近二十天,一直在學習extjs,昨天接到通知,下週將進入新的專案組培訓,培訓內容是flex。在學extjs的時候,見過別人對extjs和flex的比較。記得當時有人說extjs和flex根本不是乙個層次上的框架,但那時我依然連flex是什麼都沒有去查,而毅然的選擇了extjs。但可笑的是,下乙...

Extjs學習筆記 實戰

閒了將近二十天,一直在學習extjs,昨天接到通知,下週將進入新的專案組培訓,培訓內容是flex。在學extjs的時候,見過別人對extjs和flex的比較。記得當時有人說extjs和flex根本不是乙個層次上的框架,但那時我依然連flex是什麼都沒有去查,而毅然的選擇了extjs。但可笑的是,下乙...