SGISTL原始碼閱讀七 (__type_traits)
阿新 • • 發佈:2018-11-14
SGISTL原始碼閱讀七 (__type_traits)
前言
而這篇部落格要介紹到的__type_traits
是負責萃取型別的型別,通過萃取用來區分對應型別的構造、析構、賦值這些方法需要怎麼處理。
例如has_trivial_default_constructor
判斷是否有預設建構函式。我們知道物件的建立是需要構造的,而C++基本型別則不用。
這樣做也就是為了提高效率。
深入原始碼
//簡單的兩個結構體用來標識真假,又因其沒有任何成員,所以不會帶來額外開銷 struct __true_type { }; struct __false_type { }; //針對類非基本型 template <class type> struct __type_traits { typedef __true_type this_dummy_member_must_be_first; /* Do not remove this member. It informs a compiler which automatically specializes __type_traits that this __type_traits template is special. It just makes sure that things work if an implementation is using a template called __type_traits for something unrelated. */ /* The following restrictions should be observed for the sake of compilers which automatically produce type specific specializations of this class: - You may reorder the members below if you wish - You may remove any of the members below if you wish - You must not rename members without making the corresponding name change in the compiler - Members you add will be treated like regular members unless you add the appropriate support in the compiler. */ typedef __false_type has_trivial_default_constructor; typedef __false_type has_trivial_copy_constructor; typedef __false_type has_trivial_assignment_operator; typedef __false_type has_trivial_destructor; typedef __false_type is_POD_type; }; //針對char的特化版本 __STL_TEMPLATE_NULL struct __type_traits<char> { typedef __true_type has_trivial_default_constructor; typedef __true_type has_trivial_copy_constructor; typedef __true_type has_trivial_assignment_operator; typedef __true_type has_trivial_destructor; typedef __true_type is_POD_type; }; //針對signed char的特化版本 __STL_TEMPLATE_NULL struct __type_traits<signed char> { typedef __true_type has_trivial_default_constructor; typedef __true_type has_trivial_copy_constructor; typedef __true_type has_trivial_assignment_operator; typedef __true_type has_trivial_destructor; typedef __true_type is_POD_type; }; __STL_TEMPLATE_NULL struct __type_traits<signed char> { typedef __true_type has_trivial_default_constructor; typedef __true_type has_trivial_copy_constructor; typedef __true_type has_trivial_assignment_operator; typedef __true_type has_trivial_destructor; typedef __true_type is_POD_type; }; __STL_TEMPLATE_NULL struct __type_traits<unsigned char> { typedef __true_type has_trivial_default_constructor; typedef __true_type has_trivial_copy_constructor; typedef __true_type has_trivial_assignment_operator; typedef __true_type has_trivial_destructor; typedef __true_type is_POD_type; }; __STL_TEMPLATE_NULL struct __type_traits<short> { typedef __true_type has_trivial_default_constructor; typedef __true_type has_trivial_copy_constructor; typedef __true_type has_trivial_assignment_operator; typedef __true_type has_trivial_destructor; typedef __true_type is_POD_type; }; //... //__type_traits的特化版本還有很多,就不全部舉出了
總結
學習了iterator_traits
,你會覺得這樣的做法有些熟悉,也很容易理解。
將普通型別和非普通型別區分操作。