STL學習 萃取技術 type

2021-07-11 17:26:52 字數 2195 閱讀 3759

之前在學習stl庫中的析構工具destory()時,提到過這樣一句話,此函式設法找到元素的數值型別,進而利用__type_traits<>求取適當措施。一直難以理解,現在自己總結了下自己對萃取技術的理解。

讓自己困惑的程式:

template

void destroy(t *pointer)

template

void destroy(forwarditerator first, forwarditerator last)

template

void __destroy(forwarditerator first, forwarditerator last, t*)

//注意這裡判斷元素的數值型別是否有trivial destructor, 由於是__false_type,所以要對這個型別進行析構,所以

//輪詢呼叫destroy()進行析構

template

void __destroy_aux(forwarditerator first, forwarditerator last,__false_type)

}//由於是__true_type所以不用進行析構操作,系統會採用記憶體直接處理操作例如free

template

void __destroy_aux(forwarditerator first, forwarditerator last,__true_type)

這裡有困惑,那麼看看萃取機制

萃取技術,就是當函式,類這種一些封裝的通用演算法中的某些部分會因為資料型別不同而導致處理的邏輯不同,然而我們又不想因為資料型別的差異而修改演算法本身的封裝,所以採用萃取機制來解決這一問題。從而實現同一種操作因型別不同而異的效果。因此在stl中為了提供通用的操作而又不想損失效率就採用traits程式設計技巧。

__type_traits負責萃取型別特性,通常我們關注的型別特性有是否具備non-trivial defalt ctor?是否具備non-trivial copy ctor?是否具備non-trivial assignment operator?是否具備non-trivial dtor?如果答案是否定的(也就是說具備這些特性)就對這個型別進行構造,析構, 拷貝, 賦值等操作,這樣可以採用最有效率的措施。(比如一些自己定義的類,或者不是普通型別比如string類, 物件等,就要進行這樣的操作)如果答案是確定的(也就是說不具備這些特性,例如int, float. double, char等普通的型別就不具備這種特性)這些型別為了提高效率直接採用記憶體處理操作,例如malloc() memcpy(),所以這種機制對於大規模操作頻繁的容器有著顯著的效率的提公升。

例如:我們準備對乙個元素型別未知的陣列進行拷貝操作,如果我們知道這個元素型別是否有乙個trivial copy constructor,以便我們決定是否使用快速的memcpy(),還是使用慢速的拷貝建構函式。

下面是sgi中中的__type_traits,提供的一種機制,允許針對不同型別屬性,在編譯期完成函式派送決定(意思是在編譯期就決定是採用快速的記憶體直接處理操作還是採用慢速的構造,析構,拷貝,賦值操作)

struct __true_type{};

struct __false_type{};

template

struct __type_traits;

sgi把所有的內嵌型別都定義為__false_type,定義出最保守的值。但同時sgi還針對每乙個型別設計了適當的__type_traits的特化版本

例如:char型別,因為對char型別進行初始化,刪除,賦值,複製,都可以通過快速的記憶體直接處理操作,所以這裡將__false_type改為__true_type不具備這些特性。

__stl_template_null struct __type_traits

了解這些,現在回頭看看最上面那個之前看不懂的destroy()析構工具,目的是將[first, last)範圍ie內的所有物件析構掉,我們不知道這個範圍有多大,如果 很大,然而每個物件的析構函式都無關痛癢,那麼一次次呼叫這些析構會哪數會降低效率,因此這裡利用value_type()獲得迭代器所指物件的型別,在利用__type_traits判斷該型別的析構函式是否無關痛癢,如果是__true_type則什麼都不做,系統會採用記憶體直接處理操作,如果是__false_type才採用迴圈方式對每個物件進行析構。

CGI 萃取技術 type

在原始碼中 type traits 在 type traits.h 檔案定義,以下是泛化版本 struct true type struct false type 泛化版本 template struct type traits true type 和 false type 沒有任何成員,不會帶來額...

STL 04 萃取技術

萃取第一接觸是在高中的化學課中,看來學好c 還得懂化學啊,哈哈!ps 開玩笑的!首先我解釋下化學中的萃取。利用溶質在兩種互不相容的溶劑裡溶解度的不同,用一種溶劑將溶質從另一種溶劑中提取出來。比如汽油洗衣服上的油漬。感謝我的高中化學 開始c 中的萃取 先看看什麼是特化 模板特化分為兩種 全特化 偏特化...

STL 萃取 Traits 機制剖析

在將萃取機制之前,先要說明模板特化 當有兩個模板類,乙個是通用泛型模板,乙個是特殊型別模板,如果建立乙個特殊型別的物件,會優先呼叫特殊的型別模板類,例如 template 泛型模板 class myclass myclass template class myclass 全特化模板 myclass ...