c template筆記 1 模板函式

2022-04-17 14:21:07 字數 2684 閱讀 9116

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

#include #include #include "max.hpp"

int main()

輸出結果

::max(1,2); //ok

//::max(1,1.2);//wrong

::max(static_cast(4),4.1);//ok

若兩個引數不正確,或者不支援模板定義的特性,編譯時則會出錯

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

示例

double i = 42.1;

std::cout << "max(7,i): " << ::max(7,i) << std::endl;

返回值是t1,所以返回是int型別,結果是42,出錯了

定義3個引數,第3個引數用於表示返回值型別

template inline t3 const& max (t1 const& a, t2 const& b)

測試

double i = 42.1;

std::cout << "max(7,i): " << ::max(7,i) << std::endl;

返回正確的42.1

過載函式的最佳匹配遵循以下優先規則:

a、完全匹配時,普通函式優於模板函式及模板函式的特化版本

b、提公升轉換(如:char和short轉換為int,及float轉換為double)

c、標準轉換(如:int轉換為char,及long轉換為double)

d、使用者定義的轉換,如類宣告中定義的轉換。

加引用和const限定符之類的,屬於無關緊要的轉換,都可以認為是完全匹配,但是const優先順序應該是高於引用的,編譯器會優先嘗試轉換為const。

// maximum of two int values

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

// maximum of two values of any type

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

// maximum of three values of any type

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

int main()

特別注意::max<>(7, 42);這句的寫法指定了需要呼叫模板的例項化。 

注意:自動型別轉換

::max('a', 42.7); 只適用於常規函式,'a』會完成自動型別轉換

#include #include #include // maximum of two values of any type

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

// maximum of two pointers

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

// maximum of two c-strings

inline char const* const& max (char const* const& a,

char const* const& b)

int main ()

注意每個過載函式必須存在著一定的差異.

// maximum of two values of any type

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

// maximum of three values of any type

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

// because the following declaration comes

// too late:

// maximum of two int values

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

3引數的max呼叫的是2引數模板函式,而非最後定義的max非模板函式

#include // note: reference parameters

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

int main()

s是std:: string型別,而非char陣列,所以也出錯

#include // note: nonreference parameters

template inline t max (t a, t b)

int main()

只有最後乙個型別不符合的編譯不通過

**:

c template筆記 1 模板函式

template inline t const max t const a,t const b include include include max.hpp int main 輸出結果 max 1,2 ok max 1,1.2 wrong max static cast 4 4.1 ok 若兩個引...

c template筆記 1 模板函式

template inline t const max t const a,t const b include include include max.hpp int main 輸出結果 max 1,2 ok max 1,1.2 wrong max static cast 4 4.1 ok若兩個引數...

C template(模板)的使用

在c 中,針對於 泛型 的程式設計時,需要使用模板,泛型 任何資料型別。比如 做乙個同時支援int和double型的加法運算,並輸出。傳統的做法 include using namespace std int add int a,int b double add double a,double b ...