模板程式設計總結

2021-06-18 08:27:06 字數 2959 閱讀 9815

1、template //template parameter list

2、模版形參可以表示型別形參,也可以表示常量表示式的非型別形參。

3、使用函式模版時,編譯器會推斷出哪個或哪些模版實參繫結到模版形參。一旦編譯器確定了實際的模版實參,就稱它例項化了函式模版的乙個例項。

4、inline 只能放在template<>之後

5、型別形參也存在遮蔽問題。模版形參的名字只能在同乙個列表中出現一次,但可以在不同的列表中出現。

6、typename和class沒有區別,只是在老的版本中可能只能用class,在模版內部定義制定型別只能用typename。

7、非型別模版形參,可以返回陣列的大小。如template int get_len(t (&a[n])

8、編寫**時,對實參型別的要求應盡可能少。兩個原則:模版的形參是const引用;函式體內的測試只用《比較。

9、類模板的靜態成員變數有兩種初始化方法:

template

class a

;template

int a::ab = 0;

//template<>

double a::c = 0.0;

10、模板類和模板函式的編譯模型有包含模型和分別編譯模型。包含模型沒有大問題,只是會產生多個例項,然後連線的時候,編譯器挑乙個,忽略其他,這個跟編譯器有關;

分別編譯的話,

函式模板的定義處,加export;

export template

int add(t a, t b){}

類模板:

在實現檔案中:

export template

class aa;

#include"aa.h"

...11、類模板盡量別用非型別引數,否則容易引起**膨脹;非型別引數必須是編譯時常量表示式。

12、類模板的友元類或者友元函式,可以是不帶模板的,也可以是模板的,或者是模板+約束的;最後一種,模板+約束,必須在類之前宣告一下。

template

ostream& operator <<(ostream &, a&);

template

class b;

template

class a

13、巢狀從屬型別,要加typename。typename a::value_type a = 1;但有兩個地方不出現:乙個是基類列表,乙個是成員初始化列表

14、模板函式:模板實參推斷,常規的資料型別轉換都不用,只有兩個:(1.非const -> const, 2. 引數不是引用的時候,陣列->指標),當引數是引用時,陣列不轉為指標。

15、模板函式和普通函式過載,兩個標準:1.不用引數轉換的優先;2.普通函式優先;

16、模板函式的特化與過載的普通函式的區別:普通函式有型別轉換,特化的只有模板實參推斷;

17、類模板的operator *函式:宣告為友元函式。理由:不應該成為成員函式,否則不能執行單建構函式的隱式轉換(這種轉換只發生在函式的引數上),另外,由於模板會阻礙

隱式轉換,希望他不是模板函式,所以變成友元函式,放進函式宣告裡,這樣,當整個類例項化的時候,這個函式也例項化了,呼叫的時候,就不再是模板了。

18、成員模板的例子:智慧型指標的建構函式,希望可以接受原生指標,weak_ptr的物件,等等,所以使用成員模板,這些建構函式是explicit的,而拷貝建構函式則不是explicit

但是,不能讓誰來做引數都行,比如char*->double,不合理。所以:

template

class share_ptr

...};

但還是要實現非泛化版本的拷貝建構函式

19、繼承時,由於考慮到,模板類可以偏特化,所以,並不保證基類的東西肯定會存在,所以想要引用基類的成員,必須用以下三種方法之一:

using a::fun1;

this->func1()

a::fun1()

20、普通成員函式,定義在類外的話:

template

int aa::func()

21、編寫模板類,對實參型別的要求盡可能寬泛。

22、函式指標

template

int add(t a, t b){}

int (*f)(int, int) = add; // add在這裡就例項化了

[1]特化,偏特化

[2]成員模板

[3]traits技巧

首先需要兩個不同的型別,比如int和float,實現兩種行為,定義兩個過載版本。trait類實現一種多對1的對映,如

template

struct aa

;則預設型別為int,現在特化乙個:

template<>

struct aa

;則輸入float可以得到double.

[4]繼承

[5]表示式模板

[6]元程式設計

template

class a;};

template <>

class a<1>;};

[7]繼承

#include

using namespace std;

template

class a

public:

// template加上這句話就編譯不通過,因為成員函式模板不能是virtual的

virtual void print()

void print()

};int main()

成員模板函式不能是虛函式,因為編譯的時候編譯器就希望在解析這個類宣告的時候就知道虛表的大小,

但是成員模板呢?顯然要看整個程式中有多少個地方例項化了它,這樣就必須等整個程式都解析以後才行。所以編譯器規定成員模板不能為虛。

// 沒有引用的陣列,只有陣列的引用 

void print(int (&a)[10])

;double a = ;

print(a);

print(b);

return 0; 

}

模板 模板元程式設計

將進行型別引數代替作為一種方便的方法,這意味著產生了一種支援編譯時程式設計的機制,這樣的程式稱為模板元程式 template metaprogram 因為正在 為乙個程式進行程式設計 事實證明可以用它做很多事情。實際上,模板元程式設計就是完全的圖靈機 turing complete 因為它支援選擇 ...

模板 ACM模板總結(目錄)

目錄 一.概述 個人預期 內容概述 時間安排 二.stl 標準模板庫 vector使用 string使用 stack使用 queue使用 map使用 algorithm使用 set使用 四.字串 string 五.圖論 graph 六.網路流 network 七.資料結構 structure 八.計...

模板元程式設計

類是對物件的抽象,類模板則是對類的抽象 抽象是為提供更強的表達能力,還有統一 一致性 在更高的抽象觀點上來看,型別和值是同一種東西,同樣可以計算。模板可以看作是一種更智慧型的巨集,為了在使用時的一致性,使用了許多的技巧。現代的程式語言,要麼為了效率,把以前執行時的工作拿到編譯期。要麼為了更大的自由度...