Day47 函式模板 延遲編譯 類模板

2021-07-23 15:49:24 字數 3126 閱讀 2165

模板和標準模板庫(

stl)

實現與型別無關的演算法和資料結構,需要將實現中的型別引數化,允許使用者根據它的需要指定不同的型別

一、            

函式模板

1、 定義

template  模板形參表

template

返回型別 函式模板名(呼叫形參表)

在返回型別、呼叫形參表和函式體中,所有需要型別的地方都可以引用模板形參表的型別形參

例如:typeplate

a function(b arg)

7class integer

10    friend ostream& operator<<(ostream& os,integer const&i)

13    integer const operator+(integer const &rhs)const

16private:

17    int m_var;

18};

19int main(void)

tarena@tarena-virtual-machine:~/day48$./a.out

5.9hello, world!

4、延遲編譯

每個函式模板事實上至少要被編譯兩次,一次是在編譯器「看到」該函式模板被定義的時候,這時的編譯器只對該函式模板做一般性語法檢查(與型別無關),然後生成關於該函式模板的內部表示。當編譯器「看到」該函式模板被呼叫時,再用所提供的型別實參,結合之前生成內部表示中的型別形參,做與型別相關的語法檢查,並生成該函式模板的二進位制指令**。

1#include

2using namespace std;

3class a;

7};8template

9void foo(void)

13int main(void)

5、隱式推斷

如果函式模板呼叫引數(圓括號裡的引數)的型別相關於該模板的模板引數(尖括號裡的引數),那麼在呼叫該函式模板時,即使不顯示指定模板引數,編譯器也有能力根據呼叫引數的型別隱式推斷出正確的模板引數型別,這就叫函式模板引數的隱式推斷。但是,要注意如果編譯器隱式推斷的型別和程式設計者所期望型別不一致,有可能導致邏輯錯誤

(返回值不參與隱式推斷)

#include

using namespace std;

// 函式模版/模版函式

template

t max (t x,t y)

9template

10void bar(t const& x,t const&  y)

14template

15 rhum(t x)

21void f1(int x,int y){}

22void f2(double x,double y){}

23int main()

6、過載

與普通函式一樣,函式模板也可以形成過載關係,型別約束性越強的版本越被優先選擇

舉例:1#include

2using namespace std;

3template

4 tconst& max(t const& x, t const& y)

7template

8t* const& max(t* const& x, t* const& y)

11int main(void)

另乙個例子:

#include

#include

#include

using namespace std;

//兩個任意型別值的最大值

template

t const& max (t const& x,tconst& y) ;

class derived:public base//成員函式

typedefchar* ptr;//成員型別

1、定義

template  模板形參表

template

class 類模板名[:基類]

tmin(void)const

tmin(void)const

bool operator<(integer const& rhs)const

10private:

11    int m_var;

12    static int s_var;

13};

14template

15int a::s_var;

16int main(void)

tarena@tarena-virtual-machine:~/day48$ ./a.out

非靜態:0xbf94be60,靜態:0x804a0d8

非靜態:0xbf94be64,靜態:0x804a0d8

非靜態:0xbf94be68,靜態:0x804a0dc

非靜態:0xbf94be6c,靜態:0x804a0dc

6、 遞迴例項化

用乙個類模板的例項化型別例項化該類模板自身。

構建在空間上具有遞迴特性的復合結構,如:多維陣列,二叉樹 等等

templateclass array;

templateclass list;

templateclass tree;

array>二維陣列

array>鍊錶陣列

list>二維鍊錶

舉例:#include

using namespace std;

template

class array=...;

for(int i=0;i<3;i++){

for(int j=0;j<3;j++)

cout << d[i][j] <<' ';

cout << endl;

return 0;

tarena@tarena-virtual-machine:~/day48$./a.out

10 20 30

北京 上海南京

1 2 3

4 5 6

7 8 9

080day(函式模板和類模板)

172210704111 陳國佳總結 2017年12月30日 連續080天 內容 a.函式模板 template 返回值型別 模板名 形參表 函式體 includeusing namespace std template void swap t x,t y int main int main 輸出2...

C 函式模板和類模板 DAY3

1.c 編譯器模板機制剖析 編譯器編譯原理 1.gcc編譯器 支援多種語言,多種硬體平台的編譯器。通過對帶有函式模板的 進行編譯,檢視其組合語言,得到如下結論 1.編譯器並不是把函式模板處理成能夠處理任意類的函式 2.編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 3.在...

關於模板函式 模板類編譯成DLL

posted on 2011 08 16 08 48 單魚遊弋 閱讀 0 編輯 收藏要編譯成dll,就要宣告和實現分開。首先檔案組織是這樣的 為了簡化,沒有加上編譯成dll的語句 在 t.h 中 宣告模板函式 template typename t t max t t1,t t2 在 t.cpp 中...