C 模版初探之函式模板(一)

2021-06-21 19:12:29 字數 1973 閱讀 1541

最近研究了下c++模板,對於c++模板有了乙個初步認識,模板是c++乙個很重要也是用途很廣的乙個屬性,它很好的詮釋了c++的重用屬性。如下是我對模板的學習和總結:

c++模板主要分為:函式模板,類模版以及非型別模板。下面我將對這三種模板進行詳細的介紹和說明。

廢話少說,首先讓我來看看函式模板究竟是個神馬玩意。

一、定義

testtemplate.h

template

t const& max(t const &a, t const &b)

temlpate,typename是模板關鍵字,t(type)代表模板型別引數(注意與非型別引數區別)。由於歷史原因,typename關鍵字也可以由class代替,typename是c++後期才引進的,之前只能用class,目前class依然可用,但是class會給人帶來一種誤導t必須是class型別。所以我強烈推薦用typename.

二、使用

模板已經有了,那我們該如何使用模板呢?如下就是乙個簡單的呼叫:

#include

#include

#include "testtemplate.h"

int main()

從上面呼叫可以看出同乙份**我們可以用來處理不同型別的呼叫,這樣大大節省了**的書寫,重用性很高。上面例子中我們用到了int,double,string三種不同的型別引數去呼叫函式,其實函式模板呼叫我們應該寫為max(2,3)。同時這裡引出了乙個概念即以具體型別代替模板引數的過程稱為例項化。

這裡需要注意的一點是模板會被編譯兩次:

1.未例項化,只是對模板程式**進行語法檢查以發現諸如缺少分號等等語法錯誤。

2.例項化,編譯器檢查模板程式**中所有呼叫是否合法會在這個階段檢查出來。

三、引數推導

上面我們稍微提了一下引數,我們這裡再具體說說關於引數推導,當我們使用某一型別引數呼叫時,模板型別引數將以該引數型別確定下來。譬如:我們針對引數型別t const&處傳兩個int,編譯器必然能夠推導出t是int。注意這裡並不允許型別自動轉換即每個t都必須完全匹配氣引數。例如:

max(2,3) ;//ok

max(2,3.5);//error

有三種方式解決上述錯誤:

1.把兩個引數轉為相同型別:

max(static_cast2,3.5);

2.明確指定t的型別:

max(2,3.5);

3.明確指出使用不同模板型別:

template

t1 const& max(t1 const &a, t2 const &b)

我們仔細分析一下第三種解決方式,它確實存在不足之處。問題在於返回值的型別。如果你使用了其中乙個型別,另乙個型別可能被轉化為該型別。c++沒有提供乙個用以選擇乙個值更大的型別。

由於呼叫引數的型別由模板引數建立,所以兩者往往互相關聯。我們把這種概念稱為函式模板引數推導。對於引數推導原則我補充兩句:由於模板引數和呼叫引數之間相互關聯,如果編譯器無法推導出模板引數,你必須在呼叫時明確指定模板引數。

四、函式模板過載

話不多說先上乙個demo:

int const& max(int const& a, int const& b)

tempalete

t const& max(t const& a, t const& b)

return a < b ? b : a;

template

t const& max(t const& a, t const& b,t const& c)

return max(max(a, b), c);

int main()

這個例子說明:非模版函式可以和同名的函式模板共存,也可以和其相同型別的例項化函式共存。當其他要素都相等時,過載機制會優先選擇非模版函式,而不是選擇遊函式模板例項化的函式實體。但是如果可由模板產生更佳匹配,則模板例項化會被編譯器選中,上述第二和第三個說明這一點。

函式模板就先說到這裡,如有不足或者不對地方請大家補充和指正。接下來將會繼續說到類模板和非型別引數模板。

C 之函式模版

函式模版是通用的函式描述,有時候也被稱為引數化型別。建立模版如下 template void swap any a,any b template void swap job job1,job job2 void show job j int main template void swap job j...

變長引數模版函式初探

最開始在寫乙個 命令模組,涉及到 簡單命令 和 復合命令。所有的命令 是通過字串組裝的。命令的呼叫是通過註冊機制 實現繫結的。具體的功能封裝在對應的 功能類裡面。由於復合命令的存在,會導致一條命令 執行多個處理。所以希望在 註冊的時候,能夠直接將多個物件直接儲存到乙個容器內。這就會涉及到 不定長引數...

c 函式模版

如果需要多個將同乙個演算法用於不同型別的函式,請使用模版 函式模版 要讓編譯器知道程式需要乙個特定形式的交換函式,只需在程式中使用swap 函式即可,編譯器將檢查所使用的引數型別,並生成相應的函式,1.template void swap anytype a,anytype b anytype te...