模板定義以關鍵字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&)編譯器會例項化出兩個不同版本的compare。對第乙個呼叫,編譯器會編寫並編譯一 個compare版木,其中t被替換為int:cout << compare(1, 0) << endl; // t 為 int
// 例項化出 int compare (const vector&, const vector& )
vectorveclf vec2;
cout << compare (vecl, vec2) << endl; // t 為 vector
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 拒絕服務 拒絕服務 ...