初识c++中的函数模板
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                初识c++中的函数模板
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                函數模板
函數模板概念
函數模板:編譯器生成代碼的一個規則。函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生函數的特定類型版本。
函數模板格式
//要讓這個函數與類型無關 //Add函數模板 template<class T,typename s> //模板的參數列表 //告訴編譯器T是一種類型 T Add(T left, T right) {return left + right; }函數模板原理
針對于下面的代碼,我們看編譯器給我們的反匯編代碼,來了解函數模板編譯器是怎么處理的?
T Add(T left, T right) {cout << typeid(T).name() << endl;return left + right; } int main() {//對函數模板實例化Add(1, 2);Add(1.0, 2.0);Add('1', '2');return 0; }
 每個函數地址不一樣,說明編譯器為每個類型都準備了相對應的函數
 在編譯階段,如果編譯器檢測到對某個函數模板實例化
但是下面這個調用,就會報錯,因為第一參數給成整型,編譯器就會認為T是整型,但是第二個參數是double類型,那么編譯器又認為T是double類型,兩者沖突,編譯器就不知道T到底是什么。
 模板一般不會進行相應類型轉化
解決方法:
T Add(T left, T2 right) {cout << typeid(T).name() << endl;return left + right; }也可以手動進行強制類型轉換
 也可以這樣調用Add<int>('1', '2.0');
函數模板的實例化
用不同類型的參數使用函數模板時,稱為函數模板的實例化。模板參數實例化分為:隱式實例化和顯示實例化
隱式實例化
讓編譯器根據實參推演模板參數的實際類型
T Add(T left, T right) {cout << typeid(T).name() << endl;return left + right; } int main() {//對函數模板實例化Add(1, 2);Add(1.0, 2.0);Add('1', '2');return 0; }顯示實例化
在函數名后的<>中指定模板參數的實際類型
 如果類型不匹配,編譯器會嘗試進行隱式類型轉換,如果無法轉換成功編譯器將會報錯。
函數模板參數的匹配原則
類模板
類模板的定義
typedef int DataType; template<class T> class SeqList { public:SeqList(size_t capacity = 10):_array(new T(capacity)), _size(0), _capacity(capacity){}~SeqList(){delete[] _array;_array = nullptr;_capacity = 0;_size = 0;}//尾部void PushBack(const T& data);void PopBack(){--_size;}//任意位置插入和刪除/*void Insert(size_t pos, T&data);void Erase(size_t pos);*///在const類型成員函數中不能修改成員變量//const修飾this指針size_t size()const{return _size;}size_t Capacity()const{return _capacity;}bool Empty()const{return 0 == _size;}T&operator[](size_t index){assert(index < _size);return _array[index];}const T&operator[](size_t index) const{assert(index < _size);return _array[index];} private:void _CheckCapacity(){if (_size == _capacity){//開辟新空間T* array = new T[2 * _capacity];//拷貝元素//memcpy(array, this->_array, _size*sizeof(T));for (size_t i = 0; i < _size; ++i){array[i] = _array[i];}//釋放舊空間delete[] _array;_array = array;_capacity *= 2;}} private:T* _array;size_t _size;size_t _capacity; }; template<class T> void SeqList<T>::PushBack(const T& data) {_CheckCapacity();_array[_size] = data;_size++; }類模板的實例化
類模板實例化與函數模板實例化不同,類模板實例化需要在類模板名字后跟<>,然后將實例化的類型放在<>中即可,類模板名字不是真正的類,而實例化的結果才是真正的類。
void TestSeqList() {SeqList<int> s1;s1.PushBack(1);s1.PushBack(2);s1.PushBack(3);s1.PushBack(4);cout << s1[2] << endl;s1[2] = 10;cout << s1.size() << endl;cout << s1.Capacity() << endl;cout << s1[2] << endl;SeqList<double> s2; }總結
以上是生活随笔為你收集整理的初识c++中的函数模板的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 极米投影仪rspro2蓝牙能连几点几?
 - 下一篇: dnf35级白手装备