STL原始碼 traits的使用

2021-06-18 08:21:48 字數 2558 閱讀 6039

關於iterator traits和type traits的使用,我們什麼時候會使用這兩個類?我們怎麼使用?

//問題:將[first1,last1)區間內的元素複製一遍。

//我們需要知道first1迭代器的型別。。

template_iter copy(_iter first1,_iter last1)

else __normal_copy(__p,__first);

//方法二:

//mfc中的策略

//方法三:利用函式的過載機制和模板推斷機制

__copy(_iter(__p),__first,_copy_traits());

} return _iter(__result);

}templatevoid __copy(_iter __dest,_iter __source,__true_type)

templatevoid __copy(_iter __dest,_iter __source,__false_type)

這就是traits使用的大體情況,這裡stl中使用的統一技術就是函式過載與模板推斷機制

舉兩個stl中的例子:他們遵循的模式都是:定義介面--利用模板推斷和過載將任務分配或者說是路由-----特化特定的型別提高速度

//兩個例子:

template inline void destroy(_tp* __pointer)

//補充__value_type

template inline typename iterator_traits<_iter>::value_type*

__value_type(const _iter&)

template inline typename iterator_traits<_iter>::value_type*

value_type(const _iter& __i)

#define __value_type(__i) value_type(__i)

//銷毀物件,下面使用的策略是、其實完全不必要,只是為了在stl中使用一致的策略

template inline void _destroy(_forwarditerator __first, _forwarditerator __last)

template inline void

__destroy(_forwarditerator __first, _forwarditerator __last, _tp*)//我們需要型別資訊

template void

__destroy_aux(_forwarditerator __first, _forwarditerator __last, __false_type)

template inline void __destroy_aux(_forwarditerator, _forwarditerator, __true_type) {}

//特化

inline void _destroy(char*, char*) {}

inline void _destroy(int*, int*) {}

inline void _destroy(long*, long*) {}

inline void _destroy(float*, float*) {}

inline void _destroy(double*, double*) {}

//copy:

template inline _forwarditer uninitialized_copy(_inputiter __first, _inputiter __last, _forwarditer __result)

template inline _forwarditer __uninitialized_copy(_inputiter __first, _inputiter __last, _forwarditer __result, _tp*)

template inline _forwarditer __uninitialized_copy_aux(_inputiter __first, _inputiter __last,_forwarditer __result,__true_type)

template _forwarditer __uninitialized_copy_aux(_inputiter __first, _inputiter __last, _forwarditer __result, __false_type)

__stl_unwind(_destroy(__result, __cur));

}//對於char和wchar_t的特化版本

inline char* uninitialized_copy(const char* __first, const char* __last,

char* __result)

inline wchar_t*

uninitialized_copy(const wchar_t* __first, const wchar_t* __last,

wchar_t* __result)

STL原始碼分析 traits

traits 譯作萃取 是c 中一種特殊的程式設計技法,它是模板元程式設計最直接的用例之一。通過traits,可以抽取模板入參型別的各種屬性。接下來我們通過stl中最常見的幾種traits舉例說明。type traits用於判斷型別是否為trival 譯作平凡 如果乙個型別是trivial的,則可以...

《STL原始碼剖析》traits技法分析

在完成乙個迭代器的時候,我們可能會暴露太多的細節在外面,為了將這些細節給隱藏,我們需要封裝,這也是為什麼每一種stl容器都提供了一種專屬的迭代器。為了解決以 迭代器所指物件的型別 為型別 解決辦法是 利用template的引數推導 argument deducation template void ...

STL 原始碼閱讀

1 這裡可以看出來,容器將迭代器作為類成員。vectora iteratorite a.begin 容器的成員函式可以返回迭代器,所以迭代器是容器的成員物件。2 個人理解,迭代器是對指標的封裝和提公升,盡可能遮蔽資料結構的底層細節,對外提供統一的操作介面,這些介面跟普通指標的功能類似,比如自增或自減...