普通過載函式可以通過函式引數進行推演,並由編譯器選定最適合的過載函式作為候選函式。與此類似,模板函式可以通過函式引數的型別推演出該函式模參的實際型別。c++的編譯器在完成型別推演的過程中有以下一些技巧和注意事項,這裡我們將盡可能的列出最為常用的規則,並給出相應的示例以便於理解。
1. 最基本的模板函式型別推演。見以下**示例、關鍵性注釋和輸出結果。
1 #include 2 #include 32. 如果函式引數為t&(引用型別),其模參型別仍為t。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
1 #include 2 #include 3從輸出結果可以看出,t的實際型別仍為int,而非int&。4 template5
void func(t&s) 89
intmain()
14//
the type is 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 35. 如果在推演的過程中沒有找到精確匹配,然而函式引數是基類型別(或指標),當實參為派生類型別(或指標)時,推演仍可成功。4 template5
void
func(t) 89
void (*pf)(char) = &func; //
在本次賦值中完成了型別推演。
1011
intmain()
15//
the type is char
1 #include 2 #include 3從上述輸出結果中可以看出,t的型別被成功推演,即便func函式的實參為derive(base的派生類)。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.
6. 函式的預設引數不能參與型別推演。
1 #include 23 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 總結 函式呼叫...