首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

_type_traits 没有搞懂啊解决思路

2012-05-01 
__type_traits 没有搞懂啊C/C++ code__type_traits 没有搞懂啊结合函数destroy来理解具体看代码:template

__type_traits 没有搞懂啊

C/C++ code
__type_traits 没有搞懂啊结合函数destroy来理解具体看代码:template <class ForwardIterator>inline void destroy(ForwardIterator first, ForwardIterator last) {  __destroy(first, last, value_type(first));}得到T*后, 内部调用__destroy函数,代码如下:template <class ForwardIterator, class T>inline void __destroy(ForwardIterator first, ForwardIterator last, T*) {  typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;   //这个类型是_false_type __destroy_aux(first, last, trivial_destructor());}函数__destroy_aux有两个版本,代码如下,由于在__destroy中获得类型是_false_type ,传入的对象也是:_false_type(),自然会调用 版本void__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) 版本1:template <class ForwardIterator>inline void__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {  for ( ; first < last; ++first)    destroy(&*first);}版本2:template <class ForwardIterator> inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}发现没有, 只会进入版本呢1,不会进入版本2.  什么情况下会进入版本2呢??


[解决办法]
找本《stl源码剖析》看看?
[解决办法]
destroy用value_type函数把&(*first)传给__destroy,于是destroy得到了容器内元素的类型T,使用萃取器(一系列特化与偏特化模板类)获得true/false类型用以获知该类的析构函数是否可以忽略,再次调用__destory_aux利用true/false两个重载函数完成真正的析构操作。

版本1就是析构函数不可忽略的,需要对每一个对象调用其析构方法。
版本2就是析构函数可以忽略的,只需要在之后释放内存即可。

没记错的话,上边的destroy是allocater的成员方法,下边的destroy是全局方法,其实现为:
template<class T>
void destroy(T *p){p->~T();}

热点排行