您现在的位置是:主页 > news > 做景观要用的植物网站/上海搜索排名优化
做景观要用的植物网站/上海搜索排名优化
admin2025/5/30 14:43:03【news】
简介做景观要用的植物网站,上海搜索排名优化,服装外贸接单平台,网站收费板块怎么做__type_traits特性 在下一篇文章中将讲解Traits编程技法运用于STL实现中,它利用内嵌类型的编程技巧与编绎器的template参数推导功能,增加C未能提供的关于类型认证方面的能力。 iterator_traits负责提供迭代器的特性,__type_traits负责提取类…
__type_traits特性
在下一篇文章中将讲解Traits编程技法运用于STL实现中,它利用内嵌类型的编程技巧与编绎器的template参数推导功能,增加C++未能提供的关于类型认证方面的能力。
iterator_traits负责提供迭代器的特性,__type_traits负责提取类型的特性,关注的类型特性为:类型是否具备non-trivial default ctor,是否具备non-trivial copy ctor,是否具备non-trivial assignment operator,是否具备non-trivial dtor,如果存在默认构造函数、拷贝构造函数、赋值操作、析构函数则可使用对应函数完成构造、拷贝、赋值、析构操作,如果不存在则需要采用内存直接操作。
__type_traits提供了一种机制,针对不同的类型属性,编绎时期决定函数调用的版本,这对撰写template很有帮助,事先即可决定是调用元素类型的构造、析构、拷贝、赋值操作还是采用内存直接操作。
根据iterator_traits得来的经验,程序中可以这样运行__type_traits,T代表任意类型。
__type_traits<T>::__has_trivial_default_constructor
__type_traits<T>::__has_trivial_copy_constructor
__type_traits<T>::__has_trivial_assignment_operator
__type_traits<T>::__has_trivial_destructor
__type_traits<T>::__is_POD_type
内存基本处理工具
1,STL定义五个全局函数,作用于未初始化空间上。
2,用于构造的construct()和用于析构的destory(),以及uninitialized_copy(), uninitialized_fill(), uninitialized_fill_n(),分别对应于高层次函数copy(), fill(), fill_n()。
3,uninitialized_copy(), uninitialized_fill(), uninitialized_fill_n()使我们能将内存的配置与对象的构造行为分离开。
4,C++标准规格要求uninitialized_copy(), uninitialized_fill(), uninitialized_fill_n()具有commit or rollback,意思是要么构造出所有元素,要么当有一个构造失败时不构造任何元素。
namespace std _GLIBCXX_VISIBILITY(default)
{template<bool _TrivialValueTypes> //模板类__uninitialized_copy<bool>struct __uninitialized_copy{template<typename _InputIterator, typename _ForwardIterator>static _ForwardIterator__uninit_copy(_InputIterator __first, _InputIterator __last,_ForwardIterator __result){_ForwardIterator __cur = __result;__try{for (; __first != __last; ++__first, (void)++__cur)std::_Construct(std::__addressof(*__cur), *__first);return __cur;}__catch(...){std::_Destroy(__result, __cur);__throw_exception_again;}}};//模板类__uninitialized_copy特例化版本__uninitialized_copy<true>template<>struct __uninitialized_copy<true>{template<typename _InputIterator, typename _ForwardIterator>static _ForwardIterator__uninit_copy(_InputIterator __first, _InputIterator __last,_ForwardIterator __result){ return std::copy(__first, __last, __result); }};//迭代器__first指向拷贝起始位置,迭代器__last指向拷贝结束位置,前闭后开区间//迭代器__result指向未构造对象的原始内存template<typename _InputIterator, typename _ForwardIterator>inline _ForwardIteratoruninitialized_copy(_InputIterator __first, _InputIterator __last,_ForwardIterator __result){typedef typename iterator_traits<_InputIterator>::value_type_ValueType1; //迭代器_InputIterator指向内容的类型typedef typename iterator_traits<_ForwardIterator>::value_type_ValueType2; //迭代器_ForwardIterator指向内容的类型typedef typename iterator_traits<_InputIterator>::reference _RefType1;typedef typename iterator_traits<_ForwardIterator>::reference _RefType2;const bool __assignable = is_assignable<_RefType2, _RefType1>::value;//__type_traits提取类型特性,__is_trivial判断存在默认构造函数、拷贝构造函数、赋值操作、析构函数//如果存在则可使用对应函数完成构造、拷贝、赋值、析构操作,如果不存在则需要采用内存直接操作//该判断实例化__uninitialized_copy<bool>模板类//判断为true时,__uninit_copy执行std::copy(__first, __last, __result);//判断为false时,__uninit_copy对范围内每个迭代器执行std::_Construct(std::__addressof(*__cur), *__first);return std::__uninitialized_copy<__is_trivial(_ValueType1)&& __is_trivial(_ValueType2)&& __assignable>::__uninit_copy(__first, __last, __result);}template<bool _TrivialValueType> //模板类__uninitialized_fill<bool>struct __uninitialized_fill{template<typename _ForwardIterator, typename _Tp>static void__uninit_fill(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __x){_ForwardIterator __cur = __first;__try{for (; __cur != __last; ++__cur)std::_Construct(std::__addressof(*__cur), __x);}__catch(...){std::_Destroy(__first, __cur);__throw_exception_again;}}};//模板类__uninitialized_fill特例化版本__uninitialized_fill<true>template<>struct __uninitialized_fill<true>{template<typename _ForwardIterator, typename _Tp>static void__uninit_fill(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __x){ std::fill(__first, __last, __x); }};//前闭后开区间,__x表初值template<typename _ForwardIterator, typename _Tp>inline voiduninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __x){typedef typename iterator_traits<_ForwardIterator>::value_type_ValueType; //迭代器指向内容的类型const bool __assignable = is_copy_assignable<_ValueType>::value; //copy construction//copy construction是否为assignment以及destructor是否为trivial//该判断实例化__uninitialized_fill<bool>模板类//判断为true时,__uninit_fill执行std::fill(__first, __last, __x);//判断为false时,__uninit_fill对范围内每个迭代器执行std::_Construct(std::__addressof(*__cur), __x);std::__uninitialized_fill<__is_trivial(_ValueType) && __assignable>::__uninit_fill(__first, __last, __x);}//模板类__uninitialized_fill_n<bool>template<bool _TrivialValueType>struct __uninitialized_fill_n{template<typename _ForwardIterator, typename _Size, typename _Tp>static _ForwardIterator__uninit_fill_n(_ForwardIterator __first, _Size __n,const _Tp& __x){_ForwardIterator __cur = __first;__try{for (; __n > 0; --__n, (void) ++__cur)std::_Construct(std::__addressof(*__cur), __x);return __cur;}__catch(...){std::_Destroy(__first, __cur);__throw_exception_again;}}};//模板类__uninitialized_fill_n特例化版本__uninitialized_fill_n<true>template<>struct __uninitialized_fill_n<true>{template<typename _ForwardIterator, typename _Size, typename _Tp>static _ForwardIterator__uninit_fill_n(_ForwardIterator __first, _Size __n,const _Tp& __x){ return std::fill_n(__first, __n, __x); }};//__迭代器first指向待初始化空间起始处,__n表示初始化大小,__x表示初始化值template<typename _ForwardIterator, typename _Size, typename _Tp>inline _ForwardIteratoruninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x){typedef typename iterator_traits<_ForwardIterator>::value_type_ValueType; //迭代器指向内容的类型const bool __assignable = is_copy_assignable<_ValueType>::value; //copy construction//copy construction是否为assignment以及destructor是否为trivial//该判断实例化__uninitialized_fill_n<bool>模板类//判断为true时,__uninit_fill_n执行std::fill_n(__first, __n, __x);//判断为false时,__uninit_fill_n对范围内每个迭代器执行std::_Construct(std::__addressof(*__cur), __x);return __uninitialized_fill_n<__is_trivial(_ValueType) && __assignable>::__uninit_fill_n(__first, __n, __x);}template<typename _InputIterator, typename _ForwardIterator,typename _Allocator>_ForwardIterator__uninitialized_copy_a(_InputIterator __first, _InputIterator __last,_ForwardIterator __result, _Allocator& __alloc){_ForwardIterator __cur = __result;__try{typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;for (; __first != __last; ++__first, (void)++__cur)__traits::construct(__alloc, std::__addressof(*__cur), *__first);return __cur;}__catch(...){std::_Destroy(__result, __cur, __alloc);__throw_exception_again;}}
//省略部分内容
} // namespace