模板例項化

2021-09-03 02:25:40 字數 3090 閱讀 7886

c++中模板的例項化指函式模板(類模板)生成模板函式(模板類)的過程。對於函式模板而言,模板例項化之後,會生成乙個真正的函式。而類模板經過例項化之後,只是完成了類的定義,模板類的成員函式需要到呼叫時才會被初始化。模板的例項化分為隱式例項化和顯示例項化。 [1]

中文名模板例項化

外文名template instantiation

領    域

計算機程式設計

程式語言

c++1 1.隱式例項化

▪ 1.1模板隱式例項化的定義

▪ 1.2函式模板隱式例項化

▪ 1.3類模板隱式例項化

2 2. 顯示例項化

▪ 2.1模板顯示例項化的定義

▪ 2.2函式模板的顯示例項化

▪ 2.3類模板的顯示例項化

3 3.函式模板呼叫方式

▪ 3.1隱式模板實參呼叫

▪ 3.2顯示模板實參呼叫

編輯這是相對於模板顯示例項化而言。在使用模板函式和模板類時,不存在指定型別的模板函式和模板類的實體時,由編譯器根據指定型別引數隱式生成模板函式或者模板類的實體稱之為模板的隱式例項化。 [1] 

函式模板隱式例項化指的是在發生函式呼叫的時候,如果沒有發現相匹配的函式存在,編譯器就會尋找同名函式模板,如果可以成功進行引數型別推演,就對函式模板進行例項化。

還有一種簡介呼叫函式的情況,也可以完成函式模板的例項化。所謂的簡介呼叫是指將函式入口位址傳給乙個函式指標,通過函式指標完成函式呼叫。如果傳遞給函式指標不是乙個真正的函式,那麼編譯器就會尋找同名的函式模板進行引數推演,進而完成函式模板的例項化。參考如下示例。

#include

usingnamespacestd;

template<typenamet>voidfunc(t t)

voidinvoke(void(*p)(int))

intmain()

類模板隱式例項化指的是在使用模板類時才將模板例項化,相對於類模板顯示例項化而言的。考察如下示例程式。

#include

usingnamespacestd;

template<typenamet>classa

voidprint()

};

intmain()

程式輸出結果:a'num:6。

編輯顯示例項化也稱為外部例項化。在不發生函式呼叫的時候將函式模板例項化,或者在不適用類模板的時候將類模板例項化稱之為模板顯示例項化。

對於函式模板而言,不管是否發生函式呼叫,都可以通過顯示例項化宣告將函式模板例項化,格式為:

template函式返回型別 函式模板名《實際型別列表》(函式引數列表)

例如:templatevoidfunc<int>(constint&);

對於類模板而言,不管是否生成乙個模板類的物件,都可以直接通過顯示例項化宣告將類模板例項化,格式為:

templateclass類模板名《實際型別列表》

例如:templateclasstheclass<int>;編輯

在發生函式模板的呼叫時,不顯示給出模板引數而經過引數推演,稱之為函式模板的隱式模板實參呼叫(隱式呼叫)。如:

template<typenamet>voidfunc(t t)

func(5);//隱式模板實參呼叫

在發生函式模板的呼叫時,顯示給出模板引數而不需要經過引數推演,稱之為函式模板的顯示模板實參呼叫(顯示呼叫)。

顯示模板實參呼叫在引數推演不成功的情況下是有必要的。考察如下程式。

#include

usingnamespacestd;

template<typenamet> t max(constt& t1,constt& t2)

intmain()

直接採用函式呼叫max(i,』a』)會產生編譯錯誤,因為i和』a』具有不同的資料型別,無法從這兩個引數中進行型別推演。而採用max(i,』a』)呼叫後,函式模板的例項化不需要經過引數推演,而函式的第二個實參也可以由char轉換為int型,從而成功完成函式呼叫。 [1] 

程式設計過程中,建議採用顯示模板實參的方式呼叫函式模板,這樣提高了**的可讀性,便於**的理解和維護。

C 模板例項化

例項化 乙個通過使用具體值替換模板引數,從模板產生的普通類,函式或者成員函式的過程。特化 就是上述過程最終獲得實體。延遲例項化 當隱式例項化類模板時,同時也例項化了該模板的每個成員宣告,但並沒有例項化相應的定義,然而,存在例外 1.如果類模板包含了乙個匿名的union,那麼該union定義的成員同時...

C 之模板例項化

模板可以分為類模板與函式模板,它們的宣告形式分別為 templateclass 類名 template返回值型別 函式名 形參表 其中typename後跟的是型別引數,可以是內建型別,也可以是自定義型別,像size這種為非型別引數,為固定值。模板在沒有被例項化的情況下是不會生成二進位制 的,其實例化...

C 函式模板 模板例項化 具體化

函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式模板的使用過程 struct...