C 型別萃取

2021-08-11 00:19:39 字數 1444 閱讀 5745

當我們遇到這樣的場景時,我們會用到型別萃取

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_t i = 0; i < 10; i++)

cout

<< endl;

for (size_t i = 0; i < 10; i++)

cout

<< endl;

}

這是乙個copy函式,當它copy string時會出錯,原因是memcopy是按位元組拷貝,再拷貝string是會出錯(淺拷貝);遇到這種問題時,有兩種解決方案:1.for迴圈拷貝、2.型別萃取;但當考慮到效率時我們會用到memcpy,故我們需要將兩種情況結合使用時,這時選擇型別萃取就比較合適了(將memcpy和for迴圈拷貝視情況而用);

通過這個例子,了解到我們為什麼要用型別萃取

**:

struct _falsetype//型別

;struct _truetype//型別

;template

struct _typetraits

;template

<>

struct _typetraits//內嵌型別

通_typetraits::ispodtype()獲取資訊是一般型別還是string型別從而推演出兩份**;如下圖是型別萃取實現的整體過程從_copy(dst, str, n, _typetraits::ispodtype());出發將所有型別推演:

C 型別萃取

在c 中我們可以通過typeid來獲取乙個型別的名稱 內建型別和自定義型別都可以 但是我們不能用這種方式獲取來的名稱做變數的宣告。那麼在c 中怎樣識別物件的型別呢?我們可以通過型別萃取的方式來區分內建型別和自定義型別。例如 我們在seqlist中要用到型別萃取,因為內建型別我們可以通過memcopy...

C 型別萃取

型別萃取依靠的就是模版的特化,模版的特化又分為全特化和偏特化,根據不同的情況做相應的呼叫。函式模版特化 函式模版只有全特化,而沒有偏特化。沒有偏特化的原因是已經有了函式過載。通用模版並不總是正確的,在某些情況下有可能是錯誤的。例如 include using namespace std templa...

C 型別萃取

說到型別萃取,必須先了解模板的特化。在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式。模板特化中分為函式模板特化類與類模板特化。先建立乙個基礎的函式模板 關鍵字template後面接 尖括號裡面為空。函式名後跟一對尖括號,尖括號中指定需要特化的型別。函式形參表 必須要和模板函式的基礎引數型別完...