STL源码笔记之型别提取技法(1)

2024-05-04 23:32

本文主要是介绍STL源码笔记之型别提取技法(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STL源码利用Traits类来萃取,模板参数一些型别,我觉得蛮不错,做个笔记。

1.利用function template的参数推导机制

template<class I,class T>
Void func_impl(I iter,T t)
{T tmp;//
};
template<class I>
Void func_impl(I iter)
{func_impl(iter,*iter);
}
int main()
{int  I;func(&i);//编译器会自动进行template参数推导
}

      迭代器所指对象的型别,称为迭代器的value_type。上面技巧可以用于value_type,但是不是全面可用。万一value_type必须用于函数的传回值,毕竟template的参数推导机制导出的只是输入参数,无法推导函数的返回值型别。


2.内嵌型别

内嵌型别似乎能解决这个问题:

template<class T>
struct MyIter{typedef T value_type;T* ptr;
};
template<class I>
typename I::value_type
func(I ite){return*ite;
}
MyIter<int>ite(new int(4));
Cout<<func(ite);

       Func()的返回类型必须加上关键字typename,因为T是一个template参数,它在编译之前,编译器对T一无所知,并不知道MyIter<T>::value_type是一个型别还是一个function还是一个data member。关键字typename告诉编译器这是一个型别。


3.偏特化

       这种方案看起来是可行,但是有个陷阱,并不是所有的迭代器都是class Type,原生指针就不是。如果不是class Type,就无法定义内部型别,但是我们可以针对这种特殊情况定义特化版本,也就是将泛化版本中某些参数template参数明确固定。我们针对template参数更进一步的条件限制所设计出来的特化版本:

template<class I>
calss C{…….};  //允许I为任何型别
template<class I>
calss C<T*>{…….};  //这个特化版本仅适用于“T原生指针”的情况。

4.STL中的Traits技术

template<class T>
struct iterator_traits{typedef typename I::value_type        value_type;typedef typename I::iterator_category iterator_category;typedef typename I::difference_type   difference_type;typedef typename I::pointer           pointertypedef typename I::reference         reference
};
//两个特化版本
template<class T>
struct iterator_traits<const T*>{typedef T value_type;
…
};template<class T>
struct iterator_traits<const T*>{typedef T value_type;
…
};
//应用
template<class T>
typename iterator_traits<I>::value_type
func(I ite)
{return*ite;
}

注:若要使用这个“特性萃取机”,每个迭代器必须遵守约定,自行定义内嵌型别定义。

注:我可以学到的两点:型别提取技术,template的特化


5.迭代器(iterator)中的型别

     迭代器中包含有五种型别:value_type、difference_type、reference_type、pointer_type和iterator_category


这篇关于STL源码笔记之型别提取技法(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个