C 之模板例項化

2021-08-10 20:57:38 字數 1117 閱讀 7861

模板可以分為類模板與函式模板,它們的宣告形式分別為:templateclass 類名;

template返回值型別 函式名(形參表);

其中typename後跟的是型別引數,可以是內建型別,也可以是自定義型別,像size這種為非型別引數,為固定值。

模板在沒有被例項化的情況下是不會生成二進位制**的,其實例化分為三種方式,分別是:

1.隱式例項化

這種例項化是針對函式模板而言的,在發生函式呼叫時,編譯器會先去尋找形參完全匹配的函式,如果沒有找到,會對同名的函式模板進行推演,如果推演成功則隱式例項化該模板並完成呼叫,如果推演失敗,則會去呼叫低一級的匹配函式,如下例所示。

#includeusing namespace std;

template void func(t t)

void invoke(void(*p)(t))

};int main()

在主函式裡兩次呼叫了func函式,由於普通函式func的宣告並不存在,只存在函式模板func的定義,因此會對func函式模板進行推演,若推演能獲得成功,則將函式模板隱式例項化,在本例中分別將func模板隱式例項化為void func(int t)及void func(double t),編譯後程式裡將會存在這兩個函式的二進位制**。

2.顯示模板實參,下面給出一段程式。

#include using namespace std;

template t max (const t& t1,const t& t2)

int main()

直接呼叫函式max(i,'a')會失敗,這是因為i與『a』具有不同的型別,在進行函式模板推演的時候會失敗,而如果使用顯示模板實參max(i,'a')則直接把模板例項化了,不需要再經過引數推演,並且char型引數'a'會隱式轉化為int型別。

3.顯式例項化

即在未發生函式呼叫的時候就將函式例項化,或者在為使用模板類時將類例項化,假設有函式模板template void a (const t&)和類模板template class b,則其顯式例項化分別為:

函式模板的顯式例項化:template void a(const int&);

類模板的顯式例項化:template class b;

C 模板例項化

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

模板例項化

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

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

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