例項化:乙個通過使用具體值替換模板引數,從模板產生的普通類,函式或者成員函式的過程。
特化:就是上述過程最終獲得實體。
延遲例項化:
當隱式例項化類模板時,同時也例項化了該模板的每個成員宣告,但並沒有例項化相應的定義,然而,存在例外:
1.如果類模板包含了乙個匿名的union,那麼該union定義的成員同時也被例項化了
2.作為例項化類模板的結果,虛函式的定義可能被例項化,但也可能沒有,這依賴於具體實現
c++的例項化模型:
兩階段查詢:
第1階段:發生在模板的解析階段
非依賴型名稱:普通查詢+adl
非受限的依賴型名稱:普通查詢,但它的查詢是不完整的,在例項化的時候,還會再次進行查詢。
第2階段:發生在模板的例項化階段,此時發生的地點稱為乙個例項化點poi
依賴受限名稱:普通查詢+adl
非受限的依賴型名稱:adl (查詢完後,和第1階段的查詢結果合併成為候選函式集合)
例項化地點poi:
當某些**構造引用了模板特化,而且為了生成這個完整的特化,需要例項化相應模板的定義時,就會在源**中產生乙個例項化點(poi)。poi是位於源**中的乙個點,在該點會插入替換後的模板例項。
當c++編譯器看到f(32)時,它知道要用myint來替換t來例項化模板,即生成了乙個poi。(2)和(3)處,c++並不允許把::f(int)的定義在這裡插入。(1)和(4)的區別在於:在(1)處g(int)是不可見的,所以在(4)處。
c++規定:對於指向非型別特化的引用,它的poi定義在「包含這個引用的定義或宣告後的最近名字空間域」。
對於類的特化有點不同,例如:
當c++編譯器看到s時,它知道要用int來替換t來例項化模板,即生成了乙個poi。(6)和(7)處,c++並不允許把的定義在這裡插入。如果在(8)處,sizeof(s)表示式是無效的,因為要編譯到(8)只有才能知道s的大小,而sizeof(s)在(8)之前。c++規定:對於指向產生自模板的類例項的引用,它的poi定義在「包含這個例項引用的定義或宣告之前的最近名字空間域」。
在例項化模板的時候,可能還需要進行某些附帶的例項化。
對於非型別實體,這種二次poi的位置和主poi的位置相同。
對於型別實體,二次poi的位置位於主poi位置的緊前處。
對於上例中,(1)處是s的poi,(2a)是s的poi,(2b)是f的poi。
顯式例項化:
從語法上講,顯式例項化指示符由關鍵字template和後面的特化宣告組成,所宣告的特化就是即將由例項化獲得的特化。
在同乙個程式中,每個特定的模板特化最多只能存在一處顯式例項化,而且,如果某個模板特化已經被顯式例項化了,就不能對它進行顯式特殊化。
提高建立效率的一種方法是:在某乙個位置手工例項化特定的模板特化,並且禁止在所有其他的翻譯單元中進行模板的例項化。
在顯式例項化指示符的前面,新增乙個關鍵字extern,並且指出,只有不具備這個關鍵字的情況下,才會引發例項化過程。例:
模板例項化
c 中模板的例項化指函式模板 類模板 生成模板函式 模板類 的過程。對於函式模板而言,模板例項化之後,會生成乙個真正的函式。而類模板經過例項化之後,只是完成了類的定義,模板類的成員函式需要到呼叫時才會被初始化。模板的例項化分為隱式例項化和顯示例項化。1 中文名模板例項化 外文名template in...
C 之模板例項化
模板可以分為類模板與函式模板,它們的宣告形式分別為 templateclass 類名 template返回值型別 函式名 形參表 其中typename後跟的是型別引數,可以是內建型別,也可以是自定義型別,像size這種為非型別引數,為固定值。模板在沒有被例項化的情況下是不會生成二進位制 的,其實例化...
C 函式模板 模板例項化 具體化
函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式模板的使用過程 struct...