trait特性萃取机

2024-08-24 16:08
文章标签 特性 萃取 trait

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

先来一个图,给大家一个直观印象,看看特性萃取机是干什么的.


 

看到了吧,各种迭代器被还原成其本来类型了,这就是tait技术,stl中重要的手法之一:即获取迭代器所指向的内容.

接下来我们要看一下trait技术的实现方法.

 

首先假如有以下一个泛型的迭代器类,其中类型参数T 为迭代器所指向的类型:

template <typename T>

class myIterator

{

 ...

};

当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加入一个内嵌类型,像这样:

template <typename T>

class myIterator

{

      typedef T value_type; 

       ...

};

        这样当我们使用myIterator类型时,可以通过myIterator::value_type来获得相应的myIterator所指向的类型。例如:vector<int>::iterator it;此时value_type类型就是int,这样通过traits手法,我们获得了迭代器指向的内容.

 

现在我们来设计一个算法,使用这个信息。

template <typenameT>

typename myIterator<T>::value_typeFoo(myIterator<T> i)

{

 ...

}

       这里我们定义了一个函数Foo,它的返回参数i所指向的类型myIterator<T>::value_type,其实就是T,那么我们为什么还要兴师动众的使用那个value_type呢?那是因为,当我们希望修改Foo函数,使它能够适应所有类型的迭代器时,我们可以这样写:

template <typenameI> //这里的I可以是任意类型的迭代器

typename I::value_typeFoo(I i)

{

 ...

}//这样就能适用了所有的类型I

       现在,任意定义了value_type内嵌类型的迭代器都可以做为Foo的参数了,并且Foo的返回值的类型将与相应迭代器所指的元素的类型一致。至此一切问题似乎都已解决,我们并没有使用任何特殊的技术。然而当考虑到以下情况时,新的问题便显现出来了:

        原生指针也完全可以做为迭代器来使用,然而我们显然没有办法为原生指针添加一个value_type的内嵌类型,如此一来我们的Foo()函数就不能适用原生指针了,这不能不说是一大缺憾。那么有什么办法可以解决这个问题呢?此时便是我们的主角:类型信息榨取机 Traits 

 

我们可以不直接使用myIterator的value_type,而是通过另一个类来把这个信息提取出来:

template <typename T>

classTraits

{

      typedef typename T::value_typevalue_type;

};

这样,我们可以通过Traits<myIterator>::value_type 来获得myIterator的value_type,于是我们把Foo函数改写成:

template <typenameI> //这里的I可以是任意类型的迭代器

typename Traits<I>::value_typeFoo(I i)

{

 ...

}

然而,即使这样,那个原生指针的问题仍然没有解决,因为Trait类一样没办法获得原生指针的相关信息。于是我们祭出C++的又一件利器--偏特化(partialspecialization):

template <typename T>

classTraits<T*> //注意 这里针对原生指针进行了偏特化

{

      typedef typename Tvalue_type;

};

通过上面这个Traits的偏特化版本,我们陈述了这样一个事实:一个 T* 类型的指针所指向的元素的类型为 T。

 

如此一来,我们的Foo函数就完全可以适用于原生指针了。比如:

int *p;

....

int i= Foo(p);

Traits会自动推导出p 所指元素的类型为 int,从而Foo正确返回。

这篇关于trait特性萃取机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

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

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

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等