1. 程式人生 > >C++函式模板的顯式具體化

C++函式模板的顯式具體化

我們知道可以利用函式模板來處理不同的資料型別,然而函式模板對於某些資料型別並不能處理,具有一定的侷限性。那麼應該如何解決該侷限性呢?
例如經典的資料交換函式Swap

template <typename T>
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}

我們可能希望利用上述的函式模板實現不同型別資料的交換,然而對於數組合結構體資料型別,以上函式模板並不能使用。那麼應該如何解決這個問題呢?

顯式具體化

利用對函式模板的顯式具體化,可以解決以上問題,即明確指出哪種資料型別另外採用某一種具體化的其他方法。
假設定義瞭如下結構體:

struct job
{
char name[40];
double salary;
int floor;
}

現在希望交換兩個這種結構體的內容,原來Swap函式模板中的程式碼雖然也適用,因為C++允許將一個結構體賦給另外一個結構體。然而,如只想交換salary和floor成員,而不交換name成員,則需要使用不同的程式碼,但Swap函式的引數將保持不變,因此無法使用模板過載來提供其他程式碼。
這裡,可以提供一個具體化函式定義,稱之為顯式具體化,其中包含所需的程式碼。當編譯器找到與函式呼叫匹配的具體化定義時,將使用該定義,而不再繼續尋找模板。
C++98標準選擇了下面的具體化方法。其原型和定義以template<>開頭,並通過名稱指出型別。函式呼叫優先順序是 非模板函式>具體化模板函式>常規模板函式。
針對上述需求,可以針對只交換結構體某個內容編寫顯式具體化程式碼,如下:

template <> void Swap<job> (job &j1, &job &j2)
{
double t1;
int t2;
t1 = j1.salary;
t2 = j1.floor;
j1.salary = j2.salary;
j1.foor = j2.floor;
j2.salary = t1;
j2.floor = t2;
}