天天看點

C++泛型 顯式執行個體化與顯式具體化差別

顯式執行個體化,相當于通知編譯器接下來我要使用這種資料類型的函數,顯示的通知編譯器生成對應的模闆,以此和隐式的執行個體化相差別,隐式的執行個體化通過實參的類型來控制編譯器對于通用函數模闆相應類型的生成,而顯式執行個體化為明文通知,實際效果上兩者似乎并無太大差別。函數執行個體化有點類似于java泛型中的向下轉型:

template <typename T> T Add(T a, T b) { 
    return a + b
}
int m = 6; 
int n = 10.2;
cout << Add<double>(m, n); //這裡通過了在程式中使用函數來建立顯式執行個體化
           

将原本不比對的函數模闆強制為doublle類型執行個體化。

顯示具體化類似于泛型函數對于某一特定類型的重載,在已經實作了泛型函數的情況下,需要對某一特定類型的函數進行定制,則使用顯示具體化來實作該函數。顯式執行個體化不需要寫函數的具體實作(函數定義),而顯式具體化必須要實作。

顯式執行個體化和顯式具體化在形式上主要展現在聲明形式的不同。另外顯式具體化要實作具體的函數定義。

函數執行個體化:

template void Swap<int>(int &, int &);
           

顯式具體化:

template <> void Swap(int &, int &); 
//或者 template <> void Swap<int>(int &, int &); 
... 
template <> void Swap<int>(int &, int &) { 
    函數定義 
}


           

在使用中,如果一個函數适應多種原型,則非模闆版本優先于顯式具體化版本,顯式具體化版本優先于模闆生成版本,這裡的模闆生成版本包括顯示和隐式的執行個體化。

繼續閱讀