C Cpp STL 型別萃取

2021-10-03 15:28:15 字數 1895 閱讀 4967

型別萃取使用模板技術來萃取型別(包含自定義型別和內建型別)的某些特性,用以判斷該型別是否含有某些特性,從而在泛型演算法中來對該型別進行特殊的處理用來達到提高效率或者其他的目的。

這裡採用的例項是 stl 的 destroy() 函式的實現,原型如下圖所示:(stl_contruct.h)

該函式的作用是析構[ first , last ) 範圍內的物件。

這裡面就有個問題,forwarditerator 是否是類物件,如果是的話就可以執行其析構函式,否則是不進行任何處理的。現在的關鍵就是怎麼才知道 forwarditerator 的資料型別是屬於哪一類呢?

為了解決上述問題,這裡面就需要使用型別萃取技術了。

首先我們通過value_type(first) 獲取到了模板的資料型別。進入 __destroy() 函式,如下所示:(stl_contruct.h)

好的,關鍵時刻來了!trivial_destructor 就決定了型別 t 是否含有析構函式!它是如何被宣告的呢?這裡需要看下 __type_traits的**,如下所示:(type_traits.h)

struct __true_type

;struct __false_type

;template struct __type_traits

;__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

__stl_template_null struct __type_traits;

template struct __type_traits;

上述**中充斥著 __type_traits 的原生版本、偏特化版本以及全特化版本,也就是說,stl採用窮舉的方案,解決了如何判斷各種資料型別是否有析構函式的問題。

若 has_trivial_destructor = __true_type,則型別 t 不是類型別,所以不需要進行析構,執行**如下:(stl_contruct.h)

若 has_trivial_destructor = __false_type,則型別 t 是類型別,所以需要進行析構,執行**如下:(stl_contruct.h)

這樣就完成了 destroy() 函式的功能。

參考:(saw:game over!)

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

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