C 型別萃取

2021-07-30 06:49:01 字數 1763 閱讀 7248

在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後面接 尖括號裡面為空。函式名後跟一對尖括號,尖括號中指定需要特化的型別。函式形參表 必須要和模板函式的基礎引數型別完...