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 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控