模板的型別萃取

2021-08-11 15:04:03 字數 1804 閱讀 7909

鋪墊一下萃取的基礎點:

pod:指c風格的struct結構體定義的資料結構,且struct結構體中只能含有常規的資料型別,不能函式自定義型別;

函式過載:引數名相同,引數列表不同,返回型別可相同可不相同;

模板的特化:模板引數在某個特定型別的具體實現,分為全特化和偏特化。

類模板特化:

template 

class

date

;template <>

class

date

public:

int _year;

int _month;

};template

class

date

int>

public:

t1 _year;

int _month;

};

函式模板特化注意:函式模板特化不支援偏特化,錯誤是非法使用顯式模板引數

template

void swap(t1 a, t2 b)

template

<>

void swap(int a, int b)

錯誤的:

//template

//void swap(t1 a,int b)

//

模板的型別萃取:為了有不同的方案對模板的不同型別進行例項化,可以提高效率。

問題:用模板編寫順序表時,會出現空間不夠擴容,拷貝資料的情況——空間擴充之後直接memcpy函式將源資料段的內容拷貝到新資料段。但這種情況只適合於如 int這些基本資料型別,那麼對於string型別應該如何處理?

首先用圖來了解一下基本型別(如int)和string型別的擴容拷貝資料情況。

基本資料型別可直接用memcpy函式進行資料的拷貝,string型別要用for迴圈乙個乙個對其進行賦值,如果在乙個程式中既有內建型別又有string型別,如何在memcpy函式和for迴圈之間切換呢?這裡就要用到模板型別的萃取。

//型別萃取

struct truepod

{};struct falsepod

{};template

//模板類

class __typetraits

;template

<>//類特化

模板優缺點總結:優點:模板是復用的一種方式,復用**節省了空間資源;增強了**的靈活性。

缺點:模板讓**變得凌亂複雜,維護起來很麻煩,編譯時間也會增長;而且出現編譯錯誤時錯誤資訊不但凌亂,還定位不準確。

模板 型別萃取

當我們在實現資料結構vector時,我們發現使用mencpy時只能實現基本型別的拷貝,而不能實現自定義型別的拷貝,比如說字串型別。這問題如何解決呢?在學習了模板和基於模板的型別萃取之後,我們就有方法是在實現基本型別的拷貝時使用memcpy,在遇到自定義型別時用for迴圈來拷貝。pragma once...

模板的型別萃取

功能型別萃取,在stl中用到的比較多,用於判斷乙個變數是否為pod型別.簡述來說可以用來判斷出某個變數是內建型別還是自定義型別.通過型別萃取,萃取到變數型別,對不同變數進行不同處理,可以提公升程式效率 下面有具體講解 應用場景比如我們實現順序表,在對順序表進行擴容時,就靠重新開闢記憶體 拷貝物件.拷...

模板的型別萃取

初次接觸型別萃取是在運用模板實現seqlist的時候,拷貝構造和賦值運算子過載時,單純的使用memcopy 函式進行拷貝,只是單純的進行了淺拷貝,對於基本的資料型別是不會有任何錯誤的,但是如果是string型別時,單純的值拷貝顯然是不行的 超過了給定的buffer空間時 指向了同一塊開闢的空間,然後...