初次接觸型別萃取是在運用模板實現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...