在哪些情況需要顯示指定函式模板實參?

2021-08-08 14:48:26 字數 881 閱讀 9859

一般來說,由函式呼叫引數推導模板引數是函式模板呼叫的關鍵。也就是,呼叫引數型別隱含著模板引數型別,如果能夠推導出模板引數,那麼就不需要顯示指定。

//exp1:

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

max(3,5);//函式實參3和5都是int型別,我們可以很容易推導出t=int。

那什麼時候指定模板函式的實參型別呢?

1、當呼叫產生歧義的時候,可以指定實參型別。

max(3.0,5);//因為我們定義的函式模板只有型別t,函式引數是相同的,在用實參double的3.0和int的5呼叫就找不到匹配的函式,所以必須顯示《型別》

當然我們還可以通過max(static_cast(3.0),5)和過載函式模板方式解決這種歧義,不過我覺得這種方式最理想!

2、呼叫引數與模板引數沒發生關聯。返回型別為模板型別,且與模板引數型別不一致時,就是這種情況下的乙個典型例子。

//exp2:

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

max(3.0,5);//全部指定實參型別,順序不能變

max(3.0,5);           //這是一種簡寫方式,這種要求最後乙個不能被隱式推導的模板實參之前的所有實參型別都要指定

//在這裡,3.0推導出t1為double型別,5推導出t2為int型別,rt是不能被推導的,所以要顯示指定

3、存在過載函式情況下,在函式名稱後面加個空<>,表示只呼叫模板函式,且模板引數是通過呼叫引數推導出來的

max<>(3,5);

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...

模板函式,模板函式過載,顯示具體化模板,例項化

編譯器在選擇原型時,非模板版本函式優先於顯示具體化和模板版本函式,而顯示具體化優先於使用常規模板函式版本。1 函式模板 宣告與定義時均需加上template 說明為函式模板。eg template declaration eg.template void swap t a1 t a2 函式模板宣告。...

C 函式模板的顯示呼叫與隱式呼叫

首先定義函式模板 template inline const t c max const t a,const t b 那麼隱式呼叫也就是隱式的引數型別推導,根據引數型別決定函式模板的編譯,如 implicitly c max 1,2 使用最多的,也是隱式呼叫,上面 將使用引數型別為int的編譯模板。...