C primer 二十一 模板

2021-07-26 06:40:15 字數 1716 閱讀 9586

模板定義以關鍵字template開始,後跟乙個模板引數列表(template parameter list),這是乙個逗號分隔的乙個或多個模板引數(template parameter)的列表,用小於號()包圍起來。

模板引數列表的作用很像函式引數列表。函式引數列表定義了若干特定型別的區域性變數,但並末指出如何初始化它們。在執行時,呼叫者提供實參來初始化形參。

類似的,模板引數表示在類或函式定義中用到的型別或值。當使用模板時,我們(隱式地或顯式地)指定模板實參(template argument),將其繫結到模板引數上。

我們定義乙個compare函式,宣告乙個名為t的型別引數。在compare中,我們用名字t 表示乙個型別。而t表示的實際型別則在編譯時根據compare的使用情況來確定。

templateint compare(const t&v1,const t&v2)

例項化函式模板

當我們呼叫乙個函式模板時,編譯器(通常)用函式實參來為我們推斷模板實參。即, 當我們呼叫compare時,編譯器使用實參的型別來確定繫結到模板引數t的型別。例如, 在下面的呼叫中:

cout << compare(1, 0) <

實參型別是int。編譯器會推斷出模板實參為int,並將它繫結到模扳引數t。

編譯器用推斷出的模板引數來為我們例項化(instantiate) 乙個特定版本的函式。當編譯器例項化乙個模板時,它使用實際的模板實參代替對應的模板引數來建立出模板的乙個新「例項」。例如,給定下面的呼叫:

//例項化出int compare(const int&, const int&)

cout << compare(1, 0) << endl; // t 為 int

// 例項化出 int compare (const vector&, const vector& )

vectorveclf vec2;

cout << compare (vecl, vec2) << endl; // t 為 vector

編譯器會例項化出兩個不同版本的compare。對第乙個呼叫,編譯器會編寫並編譯一 個compare版木,其中t被替換為int:

int compare(const int &vl, const int &v2)

對第二個呼叫,編譯器會生成另乙個compare版本,其中t被料換為vector。 這些編譯器生成的版本通常被稱為模板的例項(instantiation)。

原始檔:

#include

#include

using namespace std;

templateint compare(const char(&p1)[n],const char(&p2)[m]);

templatevoid print(t(&arr)[n])

cout

print(a);

return 0;

}templateint compare(const char(&p1)[n],const char(&p2)[m])

執行結果:

Python Signal 訊號 (二十一)

常用訊號型別sigint 終止程序 中斷程序,不可通過signal.signal 捕捉 相當於ctrl c sigterm 終止程序 軟體終止訊號,可通過signal.signal 捕捉 預設訊號,當os.kill 沒有指明訊號型別時,預設的是該訊號 sigkill 終止程序 殺死程序,不可捕捉 相...

命令二十一 tar

隨著壓縮技術的發展,linux環境下提供的壓縮指令和格式開始變多。為了便於使用者區分不同壓縮檔案使用的不同壓縮技術,進而使用合適的指令進行操作,一般使用字尾標識檔案在壓縮或打包過程中所使用的壓縮技術。常見的字尾有以下幾種 z compress程式壓縮產生的檔案 現在很少使用 gz gzip程式壓縮產...

筆記(二十一) 安全

威脅 定義對應安全屬性 spoofing 偽裝 冒充他人身份 認證tampering 篡改 修改資料或 完整性repudiation 抵賴 否認做過的事情 不可抵賴性 information disclosure 資訊洩露 機密資訊洩露 機密性denial of service 拒絕服務 拒絕服務 ...