C 中函式模板的深入理解

2022-08-18 01:39:07 字數 2468 閱讀 1235

1,函式模板深入理解:

1,編譯器從函式模板通過具體型別產生不同的函式;

1,模板就是模子,通過這個模子可以產生很多的實物;

2,函式模板就是編譯器用來產生具體函式的模子;

2,編譯器會對函式模板進行兩次編譯:

1,對模板**本身進行編譯;

1,檢查函式模板本身有無語法錯誤等;

2,對引數替換後的**進行編譯;

1,呼叫函式模板的時候,編譯器要根據實際的引數型別得到真正的函式,這個時候編譯器會對這個函式進行第二次編譯;

2,注意事項:

1,函式模板本身不允許隱式型別轉換:

1,自動推導型別時,必須嚴格匹配;

1,函式模板本身不是函式,它只是產生函式的模子,因此函式模板本身不允許隱式型別轉換;

2,顯示型別指定時,能夠進行隱式型別轉換;

1,顯示指定型別,就會得到真實的函式,這個時候有可能進行隱式型別轉換;

3,函式模板的本質程式設計實驗:

1 #include 2 #include 34

using

namespace

std;56

class

test713

};14

15 template < typename t >

16void swap(t& a, t& b) //

這裡編譯器顯示為: in function 'void swap(t&, t&)';說明這也是函式,是模板函式;

1723

24 typedef void(funci)(int&, int&); //

定義函式型別,型別名為 funci;

25 typedef void(funcd)(double&, double&);

26 typedef void(funct)(test&, test&);

2728

intmain()

29

4,多引數函式模板:

1,函式模板可以定義任意多個不同的型別引數:

1,**示例:

1 template < typename t1, typename t2, typename t3 >

2t1 add(t2 a, t3 b)36

7int r = add(0.5, 0.8);

2,僅僅是呼叫的時候多了幾個泛指型別而已;

2,對於多引數函式模板:

1,無法自動推導返回值型別;

1,只有返回值型別必須手工的指定;

2,一般的工程中指定第乙個模板引數為返回值型別;

2,可以從左向右部分指定函式型別引數:

1,剩下的引數型別編譯器可以自動推導;

3,工程中,將返回值引數作為第乙個型別引數;

1,返回值是泛指型別,則將第乙個型別引數作為返回值型別;

2,這是工程中手動設定的,並不是編譯器自己的行為;

5,多引數函式模板程式設計實驗:

1 #include 2 #include 34

using

namespace

std;56

template

7< typename t1, typename t2, typename t3 >

8t1 add(t2 a, t3 b)912

1314

intmain()

15

6,當函式過載遇見函式模板會發生什麼?

1,見下本文7 中的分析;

7,過載函式模板:

1,函式模板可以像普通函式一樣被過載:

1,c++ 編譯器優先考慮普通函式;

2,如果函式模板可以產生乙個更好的匹配,那麼選擇模板;

3,可以通過空模板實參列表限定編譯器只匹配模板:

8,過載函式模板例項分析:

1 #include 2 #include 34

using

namespace

std;

56 template < typename t >

7t max(t a, t b)813

14int max(int a, int b) //

c++ 中這個函式可以過載上面的模板;

1520

21 template < typename t >

22t max(t a, t b, t c)

2328

29int

main()

30

9,小結:

1,函式模板通過具體型別產生不同的函式;

2,函式模板可以定義任意多個不同的型別引數;

3,函式模板中的返回值型別必須顯示指定;

4,函式模板可以像普通函式一樣被過載;

深入理解函式模板

函式模板深入理解 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 對模板 本身進行編譯 對引數替換後的 進行編譯 注意事項 函式模板本身不允許隱式型別轉換 自動推導型別時,必須嚴格匹配 顯示型別指定時,能夠進行隱式型別轉換 程式設計實驗 函式模板本質分析 include ...

57 深入理解函式模板

深入理解 編譯器從函式模板通過具體型別產生不同的函式。編譯器會對函式模板進行兩次編譯 對模板 本身進行編譯,對引數替換後的 進行編譯。注意事項 函式模板本身不是函式,是產生函式模子,因此模板本身不允許隱式型別轉換,自動推導型別時,必須嚴格匹配。顯示型別指定時,能夠進行隱式型別轉換。include i...

57 深入理解函式模板

1 函式模板深入理解 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 1 對模板 本身進行編譯 2 對引數替換後的 進行編譯 程式1 證明編譯器會對函式模板進行兩次編譯 include include using namespace std class test temp...