一、什麼是型別萃取,它有什麼作用
1. 型別萃取是實現不同型別資料面對同一函式實現不同的操作。
2. 增強**的復用性和可維護性。
3. 它與類封裝的區別是:並不用知道所呼叫的物件是什麼型別,型別萃取是編譯後知道型別,先實現;而類的封裝則是先定義型別,後實現方法。
二、【pod型別萃取】
pod: plain old data 平凡型別(無關痛癢的型別)–基本型別
指在c++ 中與 c相容的型別,可以按照 c 的方式處理。
通常資料的拷貝有兩種,一種為淺拷貝(值拷貝),另一種為深拷貝。
淺拷貝:只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間。
一般當遇到string型別的拷貝時,我們需要進行深拷貝,否則會導致同一塊兒空間析構多次,造成程式崩潰或;者已經釋放掉源運算元的空間,我們又解引用目的運算元的空間,由於是淺拷貝,這兩個空間位址相同,對其釋放後又解引用,程式依然會崩潰,會造成野指標問題。
## 這裡我們舉個例子 ##
struct __truetype{};
struct __falsetype{};
template
struct __typetraits
;template
<>
struct __typetraits
;template
<>
struct __typetraits
int>
;template
<>
struct __typetraits
;template
<>
struct __typetraits
;//具體實現對一種引用memcpy淺拷貝
template
t* __typecopy(t* dst, const t* src, size_t n, __truetype)
//對於像string型別的進行深拷貝
template
t* __typecopy(t* dst, const t* src, size_t n, __falsetype)
return dst;
}//最終提供給使用者的拷貝函式
template
t* typecopy(t* dst, const t* src, size_t n)
void testcopy()
; int a2[3] = ;
typecopy(a1, a2, 3);
string s1[3] = ;
string s2[3] = ;
typecopy(s1, s2, 3);
}int main(void)
這裡我們配圖再進行說明整個呼叫過程
在vs2013上執行結果
可以清楚的看到兩個雖然呼叫的是同乙個拷貝函式,但是在底層確是用不同的方式實現的。
這就是簡單的型別萃取。
C 型別萃取
在c 中我們可以通過typeid來獲取乙個型別的名稱 內建型別和自定義型別都可以 但是我們不能用這種方式獲取來的名稱做變數的宣告。那麼在c 中怎樣識別物件的型別呢?我們可以通過型別萃取的方式來區分內建型別和自定義型別。例如 我們在seqlist中要用到型別萃取,因為內建型別我們可以通過memcopy...
C 型別萃取
當我們遇到這樣的場景時,我們會用到型別萃取 template void copy t dst,t str,size t n 模板函式copy void test string s2 10 int l1 10 int l2 10 copy s1,s2,10 copy l1,l2,10 for size...
C 型別萃取
型別萃取依靠的就是模版的特化,模版的特化又分為全特化和偏特化,根據不同的情況做相應的呼叫。函式模版特化 函式模版只有全特化,而沒有偏特化。沒有偏特化的原因是已經有了函式過載。通用模版並不總是正確的,在某些情況下有可能是錯誤的。例如 include using namespace std templa...