C++标准模板库type_traits源码剖析
一、type_traits源码介绍
1、type_traits是C++11提供的模板元基础库。
2、type_traits可实现在编译期计算。包括添加修饰、萃取、判断查询、类型推导等等功能。
3、type_traits提供了编译期的true和false。
二、type_traits的作用
1、根据不同类型,模板匹配不同版本的算法
STL中的Algorithm通过Iterator存取Container内容,Functor可以协助Algorithm完全不同的策略变化。此变化请参见:C++模板编程之类型萃取 惊鸿一瞥
2、编译检查模板类型复合预期
标准库经典示例:C++11标准库thread构造函数浅析
三、type_traits源码剖析
1、添加修饰
std::add_const
std::add_volatile
std::add_cv //同时添加const和volatile
std::add_lvalue_reference //添加左值引用&
std::add_rvalue_reference //添加右值引用&&
std::declval //添加右值引用&&
std::add_pointer //先退化左、右值引用,再添加指针*
使用示例:
std::add_const<int>::type t = 0; //t为const int类型
//std::add_const<int>::type t2; //编译不通过,const定义时需要初始化
2、萃取
remove_const
remove_volatile
remove_cv
remove_reference //退化左、右值引用
remove_pointer
remove_extent //数组类型,退化一个维度
remove_all_extents //数组类型,退化所有维度
decay //退化、衰弱复合运算;const、volatile、reference、extent
auto和decltype //根据值自动推导类型。
1)auto和decltype
详细用法参见:C++11新特性:auto和decltype
2)type_traits std::decay(朽化
对于普通类型移除引用和cv符(const和volatile),规则如下:
移除T类型的引用,得到类型U,U为remove_reference < T > ::type
如果is_array < U > ::value为真,修改类型为 remove_reference< U >::type*
否则,如果is_function < U > ::value为真,修改类型为add_pointer< U >::type
否则,修改类型为remove_cv< U >::type
// 例
typedef std::decay<int>::type Normal; // int
typedef std::decay<int&>::type Ref; // int
typedef std::decay<int&&>::type RefRef; // int
typedef std::decay<const int&>::type const; // int
typedef std::decay<int[2]>::type Array; // int*
typedef std::decay<int(int)>::type FunPtr; // int(*)(int) 函数指针
因此,利用std::decay可以方便的获得函数指针。
std::remove_cv<const int>::type t; //t为int类型
t = 0;
decltype(t) t2 = 1; //t2为int类型
3、查询判断
1)实现基础为编译期的true和false:
template<class _Ty,_Ty _Val>struct integral_constant{ // convenient template for integral constant typesstatic constexpr _Ty value = _Val;using value_type = _Ty;using type = integral_constant;constexpr operator value_type() const noexcept{ // return stored valuereturn (value);}_NODISCARD constexpr value_type operator()() const noexcept{ // return stored valuereturn (value);}};template<bool _Val>using bool_constant = integral_constant<bool, _Val>;using true_type = bool_constant<true>;
using false_type = bool_constant<false>;
2)类型判断
is_void
is_enum
is_integral //int系列
is_floating_point //浮点数系列
is_pointer
is_null_pointer //C++11引入的一种类型,std::nullptr_t
is_arithmetic //算数类型。int系列、float系列
is_fundamental //int系列、float系列、void、nullptr_t
is_compound //化合物。例如:自定义类型、指针。等价!is_function
is_scalar //C++标准类型
is_union
is_class
is_array
is_object //不为函数、不为引用、不为void
is_function
使用示例:
bool b = std::true_type::value;
b = std::is_lvalue_reference<int> ::value;
3)修饰的判断
is_const
is_volatile
is_lvalue_reference
is_rvalue_reference
is_reference
4)class的定制判断
is_polymorphic //含有虚函数表的类
is_abstract //抽象的,不可实例化的类
is_final //禁止重写或继承
is_standard_layout //标准布局
is_trivial
is_trivially_copyable
is_empty //空类
is_constructible
is_destructible
is_member_function_pointer
is_member_object_pointer
is_copy_constructible
is_default_constructible
is_move_constructible
is_assignable
is_copy_assignable
is_move_assignable
has_virtual_destructor
详细使用参考:C++冷知识(二)——类型判断之性能优化
5、类型推导等复杂计算
is_same //判断两种类型是否相同
is_convertible //判断两种类型是否可以隐式转换
conditional //根据一个判断式选择两个类型中的一个,类似三元表达式
enable_if //判断一个判断式的结果是否为true
extent //计算数组第N(0开始,默认值)维度元素的个数
rank //计算数组类型的维度
result_of //获取可调用对象返回值的类型
使用示例:
bool b = std::is_same<int, bool>::value;
b = std::is_convertible<bool, int>::value;
std::conditional<true, int, bool>::type t = 0; //t为int类型
四、type_traits的高阶工具
以下用法,需完全掌握
ref/cref //引用的封装,类似智能指针。针对bind和thrad等导致引用失效
invoke //立即执行可调用对象
function //将一个可调用对象封装储存,供后续调用
bind //通用函数适配器
forward //精准转发
同类型文章参考:Traits和Policy Classes
有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810
相关文章:
C++标准模板库type_traits源码剖析
一、type_traits源码介绍 1、type_traits是C11提供的模板元基础库。 2、type_traits可实现在编译期计算。包括添加修饰、萃取、判断查询、类型推导等等功能。 3、type_traits提供了编译期的true和false。 二、type_traits的作用 1、根据不同类型,模板匹配不同版本…...

Python获取公众号(pc客户端)数据,使用Fiddler抓包工具
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 今天来教大家如何使用Fiddler抓包工具,获取公众号(PC客户端)的数据。 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,…...

Maven进阶
这里写目录标题1.分模块开发1.1 模块更新后,会造成的影响2.依赖管理2.1 依赖传递2.2 可选依赖(隐藏自己的依赖,不让别人用)2.3 排除依赖(用别人的资源,把不用的去了)3.聚合与继承3.1 为什么要使用聚合工程?3.2 聚合工程开发2.1 聚合工程三级目录1.分模块开发 我们之前做的项目…...

AXI实战(一)-为AXI总线搭建简单的仿真测试环境
AXI实战(一)-搭建简单仿真环境 看完在本文后,你将可能拥有: 一个可以仿真AXI/AXI_Lite总线的完美主端(Master)或从端(Slave)一个使用SystemVerilog仿真模块的船信体验小何的AXI实战系列开更了,以下是初定的大纲安排: 欢迎感兴趣的朋友关注并支持,以下为正文部分 文章目录…...

数据库管理-第五十六期 监控(20230210)
数据库管理 2023-02-10第五十六期 监控1 怎么监控2 直观3 历史分析4 另一个BUG总结第五十六期 监控 春节后的7天班过后就来到了2月份,本周对之前发现X8M上的那个bug进行补丁修复和协助从12.2迁移了一套PDB到这个一体机上面,2次割接。这周还和原厂老大哥…...

测试开发,测试架构师为什么能拿50 60k呢需要掌握哪些技能呢
这篇文章是软件工程系列知识总结的第五篇,同样我会以自己的理解来阐述软件工程中关于架构设计相关的知识。相比于我们常见的研发架构师,测试架构师是近几年才出现的一个岗位,当然岗位title其实没有特殊的含义,在我看来测试架构师其…...
Miniblink 入门
miniblink官网:入门之前强烈建议将Miniblink介绍仔细看一遍。 MB内核组件标准版接口文档:这里列举了所有的api以及简单的说明,但是本人建议还是看wke.h更方便,里面都是宏实现的,直接搜相关函数即可。 mb demo下载和参…...

[python入门㊷] - python存储数据
目录 ❤ json.dump()存储数据 ❤ json.laod()读取数据 ❤ 保存和读取用户生成的数据 ❤ 重构 JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用 ❤ json.dump()存储数据…...

Little Fighter:旺角——NFT 系列来袭!
《小朋友齐打交 2 (LF2) 》是一款流行的格斗游戏,由 Marti Wong 和 Starsky Wong 于 1999 年创作。这是一款非常容易上瘾的游戏,具有多种游戏模式、横向卷轴格斗系统以及 24 个具有复杂动作和连击的不同角色。这款游戏在世界范围内非常受欢迎,…...

基础篇:01-微服务概述
1.单体应用与微服务架构区别 如上图左侧为单体应用架构。在传统单体应用中,所有功能模块都在一个工程中编码、部署,即使是集群部署,也只是单体应用的水平复制。 如上图右侧为微服务架构。在微服务架构的项目中,每个应用会按照领域…...

TC358775XBG替代方案|完美替代 TC358775XBG替代方案|低BOM成本DSI转LVDS方案CS5518
TC358775XBG替代方案|完美替代 TC358775XBG替代方案|低BOM成本DSI转LVDS方案CS5518 TC358775XBG芯片的主要功能是DSI到LVDS桥,通过DSI链路实现视频流输出,以驱动LVDS兼容的显示面板。该芯片支持单链路LVDS高达1366768 24位像素分辨率,双链路L…...

Android开发
前言:因为这学期选了手机APP开发这门课,所以还是写个博客记录一下学习过程,包括安卓开发和ios开发。用到的资料包括课程PPT,和我在网上找的一些视频和资料。 1.Andriod入门 XML:描绘应用界面 (决定APP长什…...
virtualbox虚拟机导入到vmware esxi虚拟机
virtualbox导出的ova文件转换为ovf文件导入到vmware esxi虚拟机 1、下载安装程序 链接:https://pan.baidu.com/s/1pRP8MQswDSDecMB5eJGNYA?pwdmv2q 提取码:mv2q 双击VMware-ovftool-3.0.1-801290-win.x86_64.msi默认安装 2、在cmd中进入到Vware OVF…...
如何使用命名空间管理C++代码
在编写 C 代码时,管理代码组织和消除名称冲突是一个重要问题。 为了解决这个问题,C 提供了一种叫做命名空间的机制。命名空间可以将代码组织在一起,并防止不同模块间的名称冲突。 定义命名空间 首先,你需要在代码中声明命名空间…...

海思3559:BT656调试笔记
前言 海思3559a的sdk例子是没有提供BT1120和BT656视频接入的,但实际上硬件是可以支持接入的。不过前提是只支持逐行方式输入,不支持隔行视频,如果想输入PAL制式的隔行视频,请先用芯片转成逐行再接入。不知道是官方手册有意无意的忽…...
reactor之hooks
Hooks 是一个工具类,它提供了一些方法,用来在 Reactor 的各个阶段添加回调函数,进行全局性的操作。总体来说分为三类: 本部分算是reactor中比较高级的部分,建议在开始上手用reactor做项目前,大概知道有这么…...

单片AR眼镜Monocle揭秘:基于反射棱镜,重15g续航1小时
提问:一个戴近视眼镜的人,会愿意再同时戴一副AR眼镜吗?这个问题对于VR来说并不难,通常VR头显为镜框留出了空间(一些Pancake VR自带屈光调节机制),因此二者并不冲突。然而AR眼镜体积更紧凑&#…...

计算机视觉框架OpenMMLab开源学习(五):目标检测实战
✨写在前面:强烈推荐给大家一个优秀的人工智能学习网站,内容包括人工智能基础、机器学习、深度学习神经网络等,详细介绍各部分概念及实战教程,通俗易懂,非常适合人工智能领域初学者及研究者学习。➡️点击跳转到网站。…...
SpringIOC推导IOC初步
了解准备 什么是Spring? Spring是一款轻量级的控制反转(IOC)和面向切面编程(AOP)的非入侵式开源框架 2002年Spring的前身interface21发布,随后在2004年3月24日正式更名发布Spring1.0版本Spring Frameword缔…...

Linux(centOS7)虚拟机中配置 vim
👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 Ǵ…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...