在c++中我們可以通過typeid來獲取乙個型別的名稱(內建型別和自定義型別都可以),但是我們不能用這種方式獲取來的名稱做變數的宣告。那麼在c++中怎樣識別物件的型別呢??我們可以通過型別萃取的方式來區分內建型別和自定義型別。
例如:我們在seqlist中要用到型別萃取,因為內建型別我們可以通過memcopy和memmove這兩個方式進行拷貝,自定義型別或string我們要通過賦值的方式拷貝。這樣的話會提高效率。
型別萃取的方式:型別萃取是在模板的基礎上區分內建型別和其他型別,主要原理是將內建型別全部特化,然後再進行區分。
下面用pod型別萃取來講述下
pod: plain old data 平凡型別(無關痛癢的型別)–基本型別
指在c++ 中與 c相容的型別,可以按照 c 的方式處理。
#pragma once
#define _crt_secure_no_warnings 1
#include
using
namespace
std;
//型別萃取
struct truetype //內建型別是true
};struct falsetype //其他型別是false
};template
struct typetraits
;//對內建型別進行特化
template
<>
struct typetraits
;template
<>
struct typetraitsint>
;template
<>
struct typetraits
;template
<>
struct typetraitsshort>
;template
<>
struct typetraits
;template
<>
struct typetraitschar>
;template
<>
struct typetraits
;template
<>
struct typetraits
;template
<>
struct typetraits
;template
void copy( t* dest, t* src, size_t size, falsetype)
}template
void copy( t* dest, t* src, size_t size, truetype)
template
void copy(t* dest, t* src, int size)
else
//如果不是內建型別
}}void testtypetraits()
; string s2[4] = ;
copy(s1, s2, 4, typetraits ::ispodtype());
copy(s1, s2, 4);
//內建型別int
int a1[10] = ;
int a2[10] = ;
copy(a1, a2, 10, typetraits ::ispodtype());
copy(a1, a2, 10);
}
本部落格簡單的簡述下型別萃取,下面有大神的部落格
型別萃取技術
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...
C 型別萃取
說到型別萃取,必須先了解模板的特化。在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式。模板特化中分為函式模板特化類與類模板特化。先建立乙個基礎的函式模板 關鍵字template後面接 尖括號裡面為空。函式名後跟一對尖括號,尖括號中指定需要特化的型別。函式形參表 必須要和模板函式的基礎引數型別完...