您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++類模板與函數模板實例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++類模板與函數模板實例分析”吧!
當我們想要定義一個可以支持泛型的函數時,就要采用函數模板的方式了。所謂泛型就是可以支持多種類型的操作,比如我們定義一個compare操作,他可以根據傳遞給他的參數類型動態調用對應的函數版本,實現多種類型的比較。
template <typename T> int compare(const T &v1, const T &v2) { if (v1 < v2) return -1; if (v2 < v1) return 1; return 0; }
比較函數是一個模板函數,它支持T類型的對象比較,模板函數定義的規則是用template 聲明模板的類型為T,然后用T做參數即可。
調用的規則傳遞實參就可以了,前提是實參的類型要支持比較大小,如果是類的類型我們可以重載比較運算符。
int res = compare(3, 4); cout << "compare(3,4) res is " << res << endl; vector<int> v1 = {1, 3, 5}; vector<int> v2 = {2, 4}; res = compare(v1, v2); cout << "compare(v1, v2) res is " << res << endl;
我們分別傳遞了int類型和vector類型的參數作為compare比較的參數。模板函數也支持多個類型,我們可以再定義一個支持多個參數類型的模板函數
template <typename T, typename U> int printData(const T &t, const U &u) { cout << "t is " << t << endl; cout << "u is " << u << endl; }
調用規則和上邊類似,傳遞兩個不同類型即可
printData(3.4, "hello world");
模板函數也支持非參數類型,用已知類型定義變量
template <unsigned N, unsigned M> int compareArray(const char (&p1)[N], const char (&p2)[M]) { return strcmp(p1, p2); }
compareArray的模板里用了已知類型unsigned定義了兩個變量N和M。
調用的時候N和M會自動根據實參獲取值
res = compareArray("hello zack", "nice to meet u"); cout << "compareArray(" << "hello zack " << ", nice to meet u" << ") res is " << res << endl;
M和N就是傳遞的兩個數組的長度。
我們實現一個模板類,使其支持類似vector的操作,包括push_back, empty, back, 以及pop_back,取索引[]操作等。
//定義模板類型的blob template <typename T> class Blob { public: typedef T value_type; typedef typename std::vector<T>::size_type size_type; //構造函數 Blob() { data = make_shared<std::vector<T>>(); } Blob(std::initializer_list<T> il) { data = make_shared<std::vector<T>>(il); // for (const T &m : il) // { // data->push_back(m); // } } // Blob 中元素數目 size_type size() const { return data->size(); } bool empty() const { return data->empty(); } //添加和刪除元素 void push_back(const T &t) { data->push_back(t); } //移動版本的push_back void push_back(const T &&t) { data->push_back(std::move(t)); } //刪除元素 void pop_back(); //元素訪問 T &back(); T &operator[](size_type i); private: std::shared_ptr<std::vector<T>> data; //校驗數據是否有效 void check(size_type i, const std::string &msg) const; };
我們在類外實現check, pop_back, back, 以及[]操作。
template <typename T> void Blob<T>::check(size_type i, const std::string &msg) const { if (i >= data->size()) throw std::out_of_range(msg); } template <typename T> void Blob<T>::pop_back() { if (data->empty()) { return; } data->pop_back(); } template <typename T> T &Blob<T>::back() { return data->back(); } template <typename T> T &Blob<T>::operator[](size_type i) { check(i, "index out of range"); return (*data)[i]; }
每一個類的成員函數在類外實現時都要聲明template。
類模板的使用如下
void use_classtemp() { Blob<int> ia; Blob<int> ia2 = {0, 1, 2, 3, 5}; Blob<string> ia3 = {"hello ", "zack", "nice"}; for (size_t i = 0; i < ia2.size(); i++) { ia2[i] = i * i; } for (size_t i = 0; i < ia2.size(); i++) { cout << ia2[i] << endl; } for (size_t i = 0; i < ia3.size(); i++) { string_upper(ia3[i]); } for (size_t i = 0; i < ia3.size(); i++) { cout << ia3[i] << endl; } const auto &data = ia3.back(); cout << data << endl; ia3.pop_back(); const auto &data2 = ia3.back(); cout << data2 << endl; }
感謝各位的閱讀,以上就是“C++類模板與函數模板實例分析”的內容了,經過本文的學習后,相信大家對C++類模板與函數模板實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。