STL-萃取技术traits技术

2024-03-05 04:44
文章标签 技术 stl traits 萃取

本文主要是介绍STL-萃取技术traits技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

traits技术

原理:利用template的参数推导机制获取传入的参数型别。

template<typename T>
struct Iter
{typedef T value_type;....
}template<typename T>
typename T::value_type func(T* ite)
{return *ite;}

这种程度,依旧会遇到一个问题:如果不是一个class type(比如指针,引用),就无法进行正确的参数推导。可以使用模板偏特化来处理这种情形:

template<typename T>
struct Iter<T*>
{typename T value_type;
};

我们需要处理的核心问题:通过traits技术如何获得iterator描述的型别?

template<typename T>
struct iterator_traits
{typedef typename T::iterator_category iterator_category;typedef typename T::value_type value_type;typedef typename T::difference_type difference_type;typedef typename T::pointer pointer;typedef typename T::reference reference;
};

同时,iterator_traits必须对传入的型别为pointer和pointer-to-const者设计特化版本。

template<typename T>
struct iterator_traits<T*>
{...typedef random_access_iterator_tag iterator_category;
}template<typename T>
struct iterator_traits<const T*>
{...typedef random_access_iretator_tag iterator_category;
}
型别:
  • value type:描述iterator指向对象的型别。

  • difference type:描述两个iterator之间的距离,默认情况下使用C++内建的ptrdiff_t类型

  • reference type:描述iterator所指向对象的引用

  • pointer type:描述iterator所指向对象的指针

  • iterator_category

    :描述迭代器的相应性别

    • Input Iterator:只读迭代器
    • Output Iterator:只写迭代器
    • Forward Iterator:读写迭代器
    • Bidirectional Iterator:双向移动迭代器,可读写
    • Random Access Iterator:随机移动迭代器,可读写

利用重载机制,通过在编译期就为不同版本的迭代器选择不同版本的函数:

template<typename category,typename T,typename dis=ptrdiff_t,typename poin=T*,typename ref=T&>
struct iterator
{typedef category iterator_category;typedef T value_type;typedef dis difference_type;typedef poin pointer;typedef ref reference;
};struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};template <typename InputIterator,typename Distance>
inline void __advance(InputIterator& iter,Distance n,input_iterator_tag)
{while(n--)++iter;
}template <typename ForwardIterator,typename Distance>
inline void __advance(ForwardIterator& iter,Distance n,forward_iterator_tag)
{__advance(i,n,input_iterator_tag());
}template <typename BidirectionalIterator,typename Distance>
inline void __advance(BidirectionalIterator& iter,Distance n,bidirectional_iterator_tag)
{if(n > 0)while(n--)++iter;if(n < 0)while(n--)--iter;
}template <typename RandomAccessIterator,typename Distance>
inline void __advance(RandomAccessIterator& iter,Distance n,random_access_iterator_tag)
{iter += n;
}

根据traits机制,需要使用以下 的包装器:

template <typename InputIterator,typename Distance>
inline void __advance(InputIterator& iter,Distance n)
{__advance(i,n,iteratir_traits<InputIterator>::iterator_category());
}

获取型别的函数:

template<typename Iterator>
inline typename iterator_traits<Iterator>::iterator_category iteratir_category(const Iterator&)
{typedef typename iterator_traits<Iterator>::iterator_category category;return category();
}template<typename Iterator>
inline typename iterator_traits<Iterator>::distance_type* distance_type(const Iterator&)
{return static_cast<typename iterator_traits<Iterator>::distance_type*>(0);
}template<typename T>
inline typename iterator_traits<Iterator>::value_type* value_type(const Iterator&)
{return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
}
总结
  • 设计适当的型别,是迭代器的责任。

  • 设计适当的迭代器,是容器的责任。

__type_traits

traits技术弥补了C++语言本身的不足,但是traits技术不仅存在于Iterator之中,也存在于STL之中。iterator_traits负责萃取迭代器特性,__type_traits则负责萃取型别参数。此处的型别参数是指:这个型别是否具有non-trivial default ctor?是否具有non-trivial copy ctor?是否具有non-travial assignment operator?是否具有non-trravial dctor?如果没有的话,我们可以使用memcpy(),memmove()采取最有效的操作。否则的话,需要根据ctor,copy,dctor等进行复杂的操作。
可以使用如下类似与iterator_traits的方式:

__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_typestruct __true_type {};
struct __false_type {};template<typename T>
struct __type_traits
{typedef __false_type has_trivial_default_constructor;typedef __false_type has_trivial_copy_constructor;typedef __false_type has_trivial_assignment_operatortypedef __false_type has_trivial_destructor;typedef __false_type is_POD_type; 
}

STL为所有的内嵌性别定义最保守的值,然后再为体统提供类型(char,long,int,double)等设计适当的特化版本。

__STL_TEMPLATE_NULL struct __type_traits<bool> {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;
};#endif /* __STL_NO_BOOL */__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;
};__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;
};#ifdef __STL_HAS_WCHAR_T__STL_TEMPLATE_NULL struct __type_traits<wchar_t> {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;
};#endif /* __STL_HAS_WCHAR_T */__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;
};__STL_TEMPLATE_NULL struct __type_traits<unsigned 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;
};__STL_TEMPLATE_NULL struct __type_traits<int> {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 int> {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<long> {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 long> {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;
};#ifdef __STL_LONG_LONG__STL_TEMPLATE_NULL struct __type_traits<long long> {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 long long> {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;
};#endif /* __STL_LONG_LONG */__STL_TEMPLATE_NULL struct __type_traits<float> {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<double> {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<long double> {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;
};#ifdef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _Tp>
struct __type_traits<_Tp*> {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;
};#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */__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;
};__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<const 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<const 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<const 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-萃取技术traits技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775365

相关文章

离心萃取机废旧磷酸铁锂电池回收工艺流程

在废旧磷酸铁锂电池的回收工艺流程中,离心萃取机主要应用于萃取除杂的步骤,以提高回收过程中有价金属(如锂)的纯度。以下是结合离心萃取机应用的废旧磷酸铁锂电池回收工艺流程: 电池拆解与预处理 拆解:将废旧磷酸铁锂电池进行拆解,分离出电池壳、正负极片、隔膜等部分。破碎与筛分:将正负极片进行破碎处理,并通过筛分将不同粒径的物料分开,以便后续处理。 浸出与溶解 浸出:采用适当的浸出工艺(如二段式逆

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

C++ STL 适配器

系列文章目录 模板特例化,偏特化,左右值引用 https://blog.csdn.net/surfaceyan/article/details/126794013 C++ STL 关联容器 https://blog.csdn.net/surfaceyan/article/details/127414434 C++ STL 序列式容器(二) https://blog.csdn.net/surfac

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi