STL原始碼剖析 type traits程式設計技法

2021-08-07 22:25:30 字數 1465 閱讀 4298

type traits負責萃取元素型別的特性,如果元素具有某個性質則我們呼叫某個函式,如果不具有某個性質則呼叫另乙個函式。它充分利用了c++模板程式設計和編譯器的引數推導功能(編譯器只有面對類型別引數才會進行引數推導)。stl大量運用了traits程式設計技巧,通過模板特化,函式過載讓編譯器選擇正確的處理方式,在編譯期就能完成函式分發,極大的提高了靈活性。

先看乙個例子

#include 

template

struct is_void

;template

<>

struct is_void

;int main()

我們對void型別進行了特化,使value = true, 對於其他所有型別value = false

traits簡潔的說就是 :加上一層間接性,換取一定的靈活性

引用自

再看另一段**

/*

* stl type traits 程式設計技法

*/#include

using

namespace

std;

struct true_type {};

struct false_type {};

struct a{};

struct b{};

template

struct type_traits ;

//特化a

template

<>

struct type_traits;

//特化b

template

<>

struct type_traits;

template

void test(t t) ;

void _test(true_type)

void _test(false_type)

int main()

type traits用來萃取元素特性,如果元素具有某個性質則do_something,否則do_otherthing.這個例子裡對類型別a,b進行了特化,只有a型別裡has_***(某個性質)為true_type,向函式test傳遞引數t時,type_traits進行特性萃取,將t中的has_*** 賦予別名has_x,而在型別a中對true_type賦予別名has_***,所以這裡的has_x 就是true_type型別,轉呼叫函式_test,函式_test有兩個版本,根據引數進行匹配,引數為true_type型別,輸出1.呼叫test(b),test(1),test(3.5)輸出0是一樣的道理

以上就是我對type traits程式設計技法的理解

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

花了兩天時間略讀了一下 stl原始碼分析 看了個大體,對於細節並沒有深究。之所以想翻翻這本書,主要是想看看stl中的特性 介面卡的具體實現。看完之後收穫還是蠻大的,模板的各種組合讓我眼前一亮,下面大概總結一些內容。1.記憶體分配 sgi記憶體分配採用兩級實現,對於大記憶體塊的申請 大於128k 由第...