C 型別萃取

2021-08-17 09:01:27 字數 1675 閱讀 2850

型別萃取依靠的就是模版的特化,模版的特化又分為全特化和偏特化,根據不同的情況做相應的呼叫。

函式模版特化

函式模版只有全特化,而沒有偏特化。沒有偏特化的原因是已經有了函式過載。

通用模版並不總是正確的,在某些情況下有可能是錯誤的。

例如:

#include 

using

namespace

std;

template

int max(t x,t y)

int main()

這個時候我們知道數字的比較和字串的比較方式是不同的,不能一概而論,可以說全特化就是為此而生,它可以讓某些特殊情況得到正確的處理。模版函式特化形式如下:

template<>

返回值 函式名(引數列表)

注意事項:在模版特化中實參型別必須與特化版本完全一致,若有小小的不同,編譯器就會為實參模版例項化乙個例項,這非常有可能出現錯誤。

類模版的全特化與偏特化

全特化與偏特化是相當於類模板而言的。全特化是限定死模板實現的具體型別,而偏特化是針對於當模板有多個型別時,限定了其中的一部分。

//全特化

template

<>

class a

};struct _falsetype

};template

struct typetraits

;template

<>

struct typetraits

;template

<>

struct typetraits

;template

<>

struct typetraitschar>

;template

<>

struct typetraits

;//使用引數推導的萃取處理

template

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

} //內建型別用memcpy效率好

template

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

//測試

void test()

; int a2[10] = ;

//內建型別

copy(a1, a2, 10, typetraits::_ispodtype());

//非內建型別

string s1[10] = ;

string s2[10] = ;

copy(s1, s2, 10, typetraits::_ispodtype());

copy(a1, a2, 10, typetraits::_ispodtype());

}int main()

{ test();

system("pause");

return

0;

總結:型別萃取是在模板的基礎上區分內建型別與自定義型別的,即將內建型別全部特化,然後再進行區分。

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 型別萃取

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