分析C 型別萃取問題

2021-08-11 09:12:23 字數 1680 閱讀 6179

一、什麼是型別萃取,它有什麼作用

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...