模板的型別萃取

2021-08-15 21:48:22 字數 1702 閱讀 3802

初次接觸型別萃取是在運用模板實現seqlist的時候,拷貝構造和賦值運算子過載時,單純的使用memcopy(),函式進行拷貝,只是單純的進行了淺拷貝,對於基本的資料型別是不會有任何錯誤的,但是如果是string型別時,單純的值拷貝顯然是不行的(超過了給定的buffer空間時),指向了同一塊開闢的空間,然後析構時會出現問題。所以一開始直接呼叫賦值運算子的過載,這樣顯然不會出現問題,但是對基本的資料型別而言,這樣呼叫的效率顯然是沒有直接使用memcopy()高效的。

所以型別萃取的出現就是很有必要的,將無關痛癢的型別直接使用memcopy()進行拷貝,其餘的使用賦值運算子的過載來進行實現。

型別萃取是在模板的基礎上區分內建型別和其他型別,原理是將內建型別全部特化,然後再進行區分。

//型別萃取

#include

using namespace std;

struct __truetype

}; struct __falsetype

}; template

struct typetraits;

//內建型別全部特化

template <>

struct typetraits< bool>

;template <>

struct typetraits< char>

;template <>

struct typetraits< unsigned char >

;template <>

struct typetraits< short>

;template <>

struct typetraits< unsigned short >

;template <>

struct typetraits< int>

;template <>

struct typetraits< unsigned int >

;template <>

struct typetraits< long>

;template <>

struct typetraits< unsigned long >

;template <>

struct typetraits< long long >

;template <>

struct typetraits< unsigned long long>

;template <>

struct typetraits< float>

;template <>

struct typetraits< double>

;template <>

struct typetraits< long double >

;template

struct typetraits< _tp*>

;template

void copy(const t* src, t* dst, size_t size)

}else

} void test1()

;string s2[10] = ;

copy(s1, s2, 10);

copy(s1, s2, 10);

int a1[10] = ;

int a2[10] = ;

copy(a1, a2, 10);

copy(a1, a2, 10);

}int main()

模板 型別萃取

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

模板的型別萃取

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

模板的型別萃取

鋪墊一下萃取的基礎點 pod 指c風格的struct結構體定義的資料結構,且struct結構體中只能含有常規的資料型別,不能函式自定義型別 函式過載 引數名相同,引數列表不同,返回型別可相同可不相同 模板的特化 模板引數在某個特定型別的具體實現,分為全特化和偏特化。類模板特化 template cl...