型別萃取依靠的就是模版的特化,模版的特化又分為全特化和偏特化,根據不同的情況做相應的呼叫。
函式模版特化函式模版只有全特化,而沒有偏特化。沒有偏特化的原因是已經有了函式過載。
通用模版並不總是正確的,在某些情況下有可能是錯誤的。
例如:
#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後面接 尖括號裡面為空。函式名後跟一對尖括號,尖括號中指定需要特化的型別。函式形參表 必須要和模板函式的基礎引數型別完...