C 函式模板返回值指定

2021-08-11 11:34:09 字數 1650 閱讀 6318

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, 0.9);
乙個完整的利用函式模板指定函式返回值的例子如下:

#include enum class aaa : int ;

enum class bbb : int ;

enum class ccc : int ;

aaa uec2aaa (int uec)

return rc;

}templatet1 uec2rc(int a)

int main(void)

上次寫的太爛了。最近又學了一下海賊班的模板,下面是新的補充。

首先我們看下面的模板函式

templatet add(t a, t b) 

int main()

那麼問題來了,add(1, 2.5) 怎麼辦? 會報錯,因為a,b型別都是t,而1和2.5型別不一樣。而且返回值怎麼確定是什麼型別呢?

解決辦法1:顯示呼叫

cout << add(1, 2.5) << endl; //顯性呼叫模板

解決辦法2:用兩個型別t和u,並且用decltype關鍵字改寫模板

decltype 將乙個表示式變成乙個型別。

decltype(1 + 2) x; //相當於定義了int x, 因為1+2是int 型別 decltype(1+2)是乙個型別,這裡是int

注意下面不能用decltype(a, b),因為編譯器是從左到右編譯的,執行到decltype時還沒見到a,b呢。所以要用t()和u()來決定返回值。編譯器會根據a+b的型別來決定decltype(t()+u())是什麼型別。

templatedecltype(t(), u()) add(t a, u b)
注意上面寫成decltype(t()+u())也可以。

不過問題又來了,t或u不一定有預設建構函式啊。比如t或u有拷貝建構函式,或缺省建構函式後面跟了個delete,就沒辦法了。

解決辦法3:返回值後置

auto func(int a, int b) -> int
用返回值後置我們就可以把decltype(a+b)了,因為這裡編譯器已經看到a和b的型別了。注意這裡只能寫成decltype(a+b),而辦法2裡面是decltype(t(), u())和decltype(t()+u())都可以。

templateauto add(t a, u b) -> decltype(a + b)
下面注意乙個typeid和decltype的區別。

typeid -> 模板例項化之前

decltype -> 模板例項化之後,更強大

C 函式返回值。

一 params.可變引數,無論有幾個引數,必須出現在引數列表的最後,可以為可變引數直接傳遞乙個對應型別的陣列。class program test msg intarry static void test string msg,params int args 二 ref 引用傳遞 三 out ou...

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

1 函式模板 模板定義以關鍵字template開始,後接模板形參表,模板形參表是用尖括號擴住的乙個或多個模板形參的列表,形參之間以逗號分隔。關於函式模板的詳細介紹,請參考 c 中模板函式及模板類的使用 上 2 函式模板的返回值是模板型別引數 函式模板中的引數和返回值都可以是模板型別引數。編譯器必須通...

函式返回值

這裡接著探求被調函式的返回值是如何傳遞到主調函式中的,下面為c程式。add函式通過直接返回a b的,而add1函式先定義乙個區域性變數c,儲存a b的值,然後再返回c的值。其中a b可以當成乙個臨時變數,其結果是暫時存放在暫存器中的 eax 參照反匯程式設計序,可以看出函式的值並不是通過壓棧 基址定...