Step By Step C 模板推演

2021-06-09 00:03:23 字數 2439 閱讀 1890

普通過載函式可以通過函式引數進行推演,並由編譯器選定最適合的過載函式作為候選函式。與此類似,模板函式可以通過函式引數的型別推演出該函式模參的實際型別。c++的編譯器在完成型別推演的過程中有以下一些技巧和注意事項,這裡我們將盡可能的列出最為常用的規則,並給出相應的示例以便於理解。

1. 最基本的模板函式型別推演。見以下**示例、關鍵性注釋和輸出結果。

1     #include 2     #include 3

4 template5

void func1(t*t)

89 templateint n>

10void func2(t(&)[n])

1314 template15

void func3(t1 (t2::*)(t3*))

2021 template

22class

templatetest

26};

2728 template

29void func4(void (templatetest::*p)(typename templatetest::int) )

3233

class

test

36};

3738

intmain()

50//

the type is int * *

51//

the type of t is bool, n equals to 100.

52//

the type of t1 is void

53//

the type of t2 is class test

54//

the type of t3 is double

55//

n equals to 200

2. 如果函式引數為t&(引用型別),其模參型別仍為t。

1     #include 2     #include 3

4 template5

void func(t&s) 89

intmain()

14//

the type is int

從輸出結果可以看出,t的實際型別仍為int,而非int&。

3. 如果函式引數為引用型別,而函式的實參則為陣列或函式型別,那麼將不會進行任何隱式轉換。如引數不為引用型別,在此種情況下將會產生從陣列到指標和函式到函式指標的隱式型別轉換。

1     #include 2     #include 3

4 template5

void func(t const&s)

89 template10

void

func2(t s)

1314

intmain()

20//

the type is int const [5]

21//

the type is int *

從輸出結果可以看出,引用型別的函式引數仍然保持了陣列型別,而非引用型別的函式則將實參的型別轉換為指標型別。

4. 模板推演的幾個特殊示例。

1     #include 2     #include 3

4 template5

void

func(t) 89

void (*pf)(char) = &func; //

在本次賦值中完成了型別推演。

1011

intmain()

15//

the type is char

5. 如果在推演的過程中沒有找到精確匹配,然而函式引數是基類型別(或指標),當實參為派生類型別(或指標)時,推演仍可成功。

1     #include 2     #include 3

4 template5

class

base ;

78 template9

class derive : public base;

1112 template13

void func(base*)

1718

intmain()

23//

the type of t is int.

24//

the type of baseis class base.

從上述輸出結果中可以看出,t的型別被成功推演,即便func函式的實參為derive(base的派生類)。

6. 函式的預設引數不能參與型別推演。

1     #include 2

3 template4

void func(t x = 100) 7

8int

main()

Step By Step C 模板目錄

對於c 模板,其強大和高深早已為業界所共識。相比於其他語言,c 是在設計之初便已經提供了對泛型和模板的支援。然而隨著語言的發展,與其相關的庫也是層次不窮,其中的佼佼者主要為stl 已為c 標準庫 boost和loki等。很多酷愛c 的開發者投入了大量的時間和精力去深入的研習它們,當然回報也是相當豐厚...

設計模式推演 序

作為設計模式推演的序章,我們以一本書中的例子為序 我們有一些基本的設計原則,復用 易用,有oo 5p設計原則 isp 介面隔離原則,lsp黎克特制替換原則,ocp 開閉原則,srp單一職責原則,dip抽象依賴倒置原則 我們也有oo工具,封裝,繼承,多型 最後也有基本的設計模式,各種工廠方法,comm...

陣列做函式推演

include stdlib.h include string.h include stdio.h int a 10 int a int a 陣列做函式形參的時候,如果在形參中定義int a 10 語句,c c 編譯器 會做優化,技術推演如下 int a 10 int a int a 總結 函式呼叫...