模板實例化

C++中模板的實例化指函式模板(類模板)生成模板函式(模板類)的過程。對於函式模板而言,模板實例化之後,會生成一個真正的函式。而類模板經過實例化之後,只是完成了類的定義,模板類的成員函式需要到調用時才會被初始化。模板的實例化分為隱式實例化和顯示實例化。

基本介紹

  • 中文名:模板實例化
  • 外文名:template instantiation
  • 領域:計算機編程
  • 程式語言:C++
1.隱式實例化,1.1模板隱式實例化的定義,1.2函式模板隱式實例化,1.3類模板隱式實例化,2. 顯示實例化,2.1模板顯示實例化的定義,2.2函式模板的顯示實例化,2.3類模板的顯示實例化,3.函式模板調用方式,3.1隱式模板實參調用,3.2顯示模板實參調用,

1.隱式實例化

1.1模板隱式實例化的定義

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

1.2函式模板隱式實例化

函式模板隱式實例化指的是在發生函式調用的時候,如果沒有發現相匹配的函式存在,編譯器就會尋找同名函式模板,如果可以成功進行參數類型推演,就對函式模板進行實例化。
還有一種簡介調用函式的情況,也可以完成函式模板的實例化。所謂的簡介調用是指將函式入口地址傳給一個函式指針,通過函式指針完成函式調用。如果傳遞給函式指針不是一個真正的函式,那么編譯器就會尋找同名的函式模板進行參數推演,進而完成函式模板的實例化。參考如下示例。
#include <iostream>using namespace std;template <typename T> void func(T t){    cout<<t<<endl;} void invoke(void (*p)(int)){    int num=10;    p(num);}int main(){    invoke(func);}

1.3類模板隱式實例化

類模板隱式實例化指的是在使用模板類時才將模板實例化,相對於類模板顯示實例化而言的。考察如下示例程式。
#include <iostream>using namespace std;template<typename T>class A{    T num;public:    A(){        num=T(6.6);    }    void print(){        cout<<"A'num:"<<num<<endl;    }}; int main(){    A<int> a; //顯示模板實參的隱式實例化    a.print();}
程式輸出結果:A'num:6。

2. 顯示實例化

2.1模板顯示實例化的定義

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

2.2函式模板的顯示實例化

對於函式模板而言,不管是否發生函式調用,都可以通過顯示實例化聲明將函式模板實例化,格式為:
template函式返回類型 函式模板名<實際類型列表>(函式參數列表)
例如:
   template void func<int>(const int&);

2.3類模板的顯示實例化

對於類模板而言,不管是否生成一個模板類的對象,都可以直接通過顯示實例化聲明將類模板實例化,格式為:
    template class 類模板名<實際類型列表>
例如:
         template class theclass<int>;

3.函式模板調用方式

3.1隱式模板實參調用

在發生函式模板的調用時,不顯示給出模板參數而經過參數推演,稱之為函式模板的隱式模板實參調用(隱式調用)。如:
template <typename T> void func(T t){    cout<<t<<endl;}    func(5);//隱式模板實參調用

3.2顯示模板實參調用

在發生函式模板的調用時,顯示給出模板參數而不需要經過參數推演,稱之為函式模板的顯示模板實參調用(顯示調用)。
顯示模板實參調用在參數推演不成功的情況下是有必要的。考察如下程式。
#include <iostream>using namespace std;template <typename T> T Max(const T& t1,const T& t2){    return (t1>t2)?t1:t2;} int main(){    int i=5;    //cout<<Max(i,'a')<<endl; //無法通過編譯    cout<<Max<int>(i,'a')<<endl; //顯示調用,通過編譯}
直接採用函式調用Max(I,’a’)會產生編譯錯誤,因為i和’a’具有不同的數據類型,無法從這兩個參數中進行類型推演。而採用Max<int>(i,’a’)調用後,函式模板的實例化不需要經過參數推演,而函式的第二個實參也可以由char轉換為int型,從而成功完成函式調用。
編程過程中,建議採用顯示模板實參的方式調用函式模板,這樣提高了代碼的可讀性,便於代碼的理解和維護。

相關詞條

熱門詞條

聯絡我們