一: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。但可笑的是,下乙...