C 中函式模板的返回值是模板型別引數的呼叫方法

2021-09-27 06:41:12 字數 1013 閱讀 8514

1 函式模板

模板定義以關鍵字template開始,後接模板形參表,模板形參表是用尖括號擴住的乙個或多個模板形參的列表,形參之間以逗號分隔。關於函式模板的詳細介紹,請參考《c++中模板函式及模板類的使用(上)》。

2 函式模板的返回值是模板型別引數

函式模板中的引數和返回值都可以是模板型別引數。編譯器必須通過呼叫函式模板的實參來推斷模板型別引數的具體型別。但是,當函式模板的返回值是模板型別引數時,編譯器無法通過函式呼叫來推斷返回值的具體型別。此時,在呼叫函式時必須提供乙個顯式模板實參(explicit template argument)。

3 顯式模板實參

顯式模板實參在尖括號中給出,位於函式名之後,實參列表之前。顯式模板實參按由左向右的順序與對應的模板引數匹配。例如

templatet1 myfunc(t2, t3);

此時,呼叫myfunc()函式模板的**為

myfunc(『1』, 0.1f);

此時,t1的型別是int,t2的型別是char,t3的型別是float。

如果可以從呼叫函式的實參中推斷出來t2和t3的型別,則可以從顯式模板實參的尾部開始,從右向左依次省略。例如,以上呼叫函式的**還可以寫成

myfunc(『1』, 0.1f);

此時,t2和t3的型別可以通過函式的實參進行推斷。

4 實戰

在csdn論壇中有朋友提到以下問題

template t1 fun(t2 x, t2 y)

此時,呼叫fun()函式,

fun(5, 6);

此時,編譯工具會提示「沒有與引數列表匹配的引數模板」。產生以上問題的主要原因就是編譯器無法推斷出t1的型別。可以使用指定顯式模板實參的方法解決。

fun(5, 6)

或者

fun(5, 6)

C 函式模板返回值指定

c 函式模板不能偏特化,可以全特化。另外,返回值也是可以用static cast指定的。舉例如下 templatet1 add t2 a,t3 b 指定t1為int,如下 int result add 0.4,0.9 指定t1,t2引數為int和float,如下 int result add 0.4...

C 中的模板(函式模板,類模板)

1.模板是生成類或函式的框架,模板使用形參,當實際資料型別賦值給形參的時候,才由編譯器生成類或函式 2.函式模板的宣告由關鍵字template和包含乙個或多個資料型別形參的引數列表構成,形參資料型別 t 前面可以是class也可以是typename,型別形參t要用尖括號 括起來 template 或...

C 函式返回值型別

c 語言的函式返回值型別可以分為內部型別和自定義型別兩大類。在函式返回內部型別中不能返回陣列型別但可以返回指向陣列的指標,同樣也可以返回指向函式的函式指標。如果希望返回值可以作為左值 即可以放在賦值操作符左邊的 那就必須返回引用型別。而在函式返回自定義型別 即返回類型別 中根據是否可作為左值,返回值...