一、什么是模板
??????? C++中的模板分為類模板和函數模板,并不是一個實際的類或函數,這指的是編譯器不會自動為其生成具體的可執行代碼。只有在具體執行時,編譯器才幫助其實例化。
二、為什么引入模板
??????? 拿我們最常見的交換函數來舉例子,如果我們編寫一個交換int類型變量的函數,如下:
bool Swap(int &a, int &b) {int c = a;a = b;b = c;return true;
}
??????? 但如果我們想要編寫一個通過函數來交換float的函數,我們又要寫另一個函數,如下:
bool Swap(float &a, float &b) {float c = a;a = b;b = c;return true;
}
???????? 那接下來如果需要交換double,char,bool,甚至一些結構體或者類的交換函數,那么我們的工作量就會很大。細心觀察會發現,其實上邊兩個函數唯一不同的便是交換的變量類型不同,如果我們把變量類型設置為一個抽象的X,在具體需要交換的時候,再去根據具體的類型去自動適應,這便是C++的template模板的巧妙之處。
三、使用方式
????????C++模板采用template關鍵字修飾
3.1 函數模板
??????? 具體寫法如下:
template <typename 參數類型1, typename 參數類型2,...>
返回值類型 函數名稱(形參1, 形參2,...) {函數體
}
??????? 上邊代碼的typename關鍵字也可以用class代替。下邊給出一個交換函數模板的例子:
template <typename T>
bool Swap(T &a, T &b) {T c = a;a = b;b = c;return true;
}
? 3.2 類模板
? ????????具體寫法如下:
template <typename 模板名稱1, typename 模板名稱2,...>
class 類名稱{類成員
}
??????? 注意,在實例化類模板對象時,需要在類的結尾加上<具體模板名稱>。 比如以下例子:
template <typename T1, typename T2>
class NNUM {private :T1 num1;T1 num2;public :NNUM(T1 num1, T1 num2) {this->num1 = num1;this->num2 = num2; }void print_NNUM(T2 str) {cout << "str : [" << str << "]" << endl;cout << "num1 : <" << this->num1 << ">, " << "num2 : <" << num2 << ">" << endl;}
};
?????? 這里是一個用了2個模板類型(T1和T2)的類模板,那么我們在實例化時候就要按照以下代碼,將具體需要使用的T1與T2類型體現出來:
NNUM<int, string> n1 = NNUM<int, string>(123, 456);