模板的一些總結

2022-07-16 02:45:20 字數 3089 閱讀 3295

1.模板中巢狀依賴型別名在使用過程中遵循

·在宣告 template parameters(模板引數)時,class 和 typename 是可互換的。

·用 typename 去標識 nested dependent type names(巢狀依賴型別名),在 base class lists(基類列表)中或在乙個 member initialization list(成員初始化列表)中作為乙個 base class identifier(基類識別符號)時除外。

很明顯當乙個陌生的類中的函式被使用的時候 是會產生解析矛盾的,這個時候告訴編譯器是什麼型別很重要。

提問乙個問題,以下模板的宣告中,classtypename有什麼不同?

template class test;

template class test;

答案:沒有不同。然而,c++ 並不總是把 class 和 typename 視為等價。有時候我們一定得使用 typename。

預設情況下,c++ 語言假定通過作用域運算子訪問的名字不是型別。因此,如果我們希望使用乙個模板型別引數的型別成員,就必須顯式告訴編譯器該名字是乙個型別。我們通過使用關鍵字 typename 來實現這一點:

template

typename t::value_type top(const t &c)

在這裡我們只需要記住一點,當我們希望通知編譯器乙個名字表示型別時,必須使用關鍵字 typename,而不能使用 class。

2.簡單的用法總結

函式模板的宣告形式如下:template function_declaration;template function_declaration;

宣告類的方法也是同理

template class stack ;

3.模板可以有型別引數,也可以有常規的型別引數int,也可以有預設模板引數,例如

templateclass stack

4.函式

模板專門化

當我們要定義模板的不同實現,我們可以使用模板的專門化。例如我們定義的stack類模板,如果是char*型別的棧,我們希望可以複製char的所有資料到stack類中,因為只是儲存char指標,char指標指向的記憶體有可能會失效,stack彈出的堆疊元素char指標,指向的記憶體可能已經無效了。還有我們定義的swap函式模板,在vector或者list等容器型別時,如果容器儲存的物件很大,會占用大量記憶體,效能下降,因為要產生乙個臨時的大物件儲存a,這些都需要模板的專門化才能解決。

函式模板專門化

假設我們swap函式要處理乙個情況,我們有兩個很多元素的vector,在使用原來的swap函式,執行tmpt = t1要拷貝t1的全部元素,占用大量記憶體,造成效能下降,於是我們系統通過vector.swap函式解決這個問題,**如下:

#include using namespace std;

templatevoid swap(t& t1, t& t2)

template<> void swap(std::vector& t1, std::vector& t2)

template<>字首表示這是乙個專門化,描述時不用模板引數

vector的swap**還是比較侷限,如果要用模板專門化解決所有vector的swap,該如何做呢,只需要把下面**

template<> void swap(std::vector& t1, std::vector& t2)

改為
templatevoid swap(std::vector& t1, std::vector& t2)
就可以了,其他**不變。

5.類模板專門化

#include

template

class compare

};template<>class compare

};6.

乙個類沒有模板引數,但是成員函式有模板引數,是可行的,**如下:

class util 

};int main()

甚至可以把util的equal宣告為static,**如下:

class util 

};int main()

7.在 c++ 中,型別的名字(包括類的名字)本身也是一種運算子,即型別強制轉換運算子。

型別強制轉換運算子是單目運算子,也可以被過載,但只能過載為成員函式,不能過載為全域性函式。經過適當過載後,(型別名)物件這個對物件進行強制型別轉換的表示式就等價於物件.operator 型別名(),即變成對運算子函式的呼叫。

下面的程式對 double 型別強制轉換運算子進行了過載。

#include

usin

g namespace std;

classcomplex

;operator double() //過載強制型別轉換運算子 double

};int main()

程式的輸出結果是:

1.23.2

第 8 行對 double 運算子進行了過載。過載強制型別轉換運算子時,不需要指定返回值型別,因為返回值型別是確定的,就是運算子本身代表的型別,在這裡就是 double。

過載後的效果是,第 13 行的(double)c等價於c.operator double()

有了對 double 運算子的過載,在本該出現 double 型別的變數或常量的地方,如果出現了乙個 complex 型別的物件,那麼該物件的 operator double 成員函式就會被呼叫,然後取其返回值使用。

例如第 14 行,編譯器認為本行中c這個位置如果出現的是 double 型別的資料,就能夠解釋得通,而 complex 類正好過載了 double 運算子,因而本行就等價於:

double n = 2 + c.operator double();

c 模板的一些

stl中大量的運用了模板 今天就拿stl 的容器和一些相關的操作來說明下 std set 新增自定義比較操作 templatestruct lesscmp std set ms 2 迴圈遍歷,這個肯定木有難度了 template void myprint const t lhs for each m...

一些實用的模板

1 floyd判最小環 注 包含基本的floyd演算法。最好寫的單源最短路徑演算法。但時間複雜度o n 3 n 1000基本就用不了了。void floyd 3 dijkstra 迪傑斯特拉 演算法 單源最短路徑演算法 基本思路 每次確定到起點距離最短且距離尚未確定的點的dis,並對其所有鄰邊進行鬆...

一些模板的應用

首先,是曾經的講師lh大佬的模板 主要涉及了常用的檔案頭以及一些常用語句和函式的縮寫 include include include include include include include include include include using namespace std typedef...