c++学习笔记(12)-traits

1、概念

C++ 中的 type traits 是一种模板元编程技术,用于在编译期间判断、查询类型的属性。Type traits 可以帮助程序员在编译时进行类型判断,而不是在运行时判断,避免了程序中的不必要开销,并且可以提供更好的类型安全性。

2、用途

Type traits 提供了许多模板类和变量,用于查询类型的属性和特征,包括以下几个方面:

  1. 类型类别:判断类型是否是某个类别,例如 std::is_pointer 用于检查类型 T 是否为指针类型。
  2. 空间特性:判断类型的内存布局,比如是否为标准布局类型、是否为平凡类型等。
  3. 转换能力:判断类型是否能隐式转换为另一种类型,例如 std::is_convertible<A,B> 用于判断类型 A 是否能够隐式转换为类型 B。
  4. 类型转换:去除或者添加类型修饰符const、volatile、&、*。例如 std::decay 用于去掉 T 所有修饰符:引用、 const、volatile。
  5. 获取类型之间的关系:common_type<T1, T2>用于计算类型 T1 和类型T2 的公共类型;is_base_of<Base, Derived>用于判断类型 Base 是否是类型 Derived 的基类。
  6. 条件元编程:conditional<C, T1, T2>用于根据类型 C 是否为真,选择返回类型 T1 或 T2;例如 std::enable_if<B, T> 用于根据条件 B 启用或禁用模板函数或类。

3、例子

以下是一个使用Type Traits的示例:

#include <iostream>
#include <type_traits>template <typename T>
void printIfIntegral(const T& val)
{if (std::is_integral<T>::value) {std::cout << "整数类型" << std::endl;}else {std::cout << "非整数类型" << std::endl;}
}int main()
{printIfIntegral(10);//输出:整数类型printIfIntegral(9.8);//输出:非整数类型printIfIntegral("hello world");//输出:非整数类型return 0;
}

在这个例子中,我们定义了一个 printIfIntegral 函数,该函数接受一个参数 val,并使用 std::is_integral 来判断该参数是否为整数类型。

4、原理

下面举几个例子简单介绍一下部分type traits的实现原理。

4.1、is_pointer

以下是std::is_pointer的简单实现:

template<typename T>
struct is_pointer {static const bool value = false;
};template<typename T>
struct is_pointer<T*> {static const bool value = true;
};

这个实现通过对不同类型进行特化来判断它们是否为指针类型。如果一个类型与T*匹配,那么value成员变量就被置为true。否则,value保持为默认值false。

4.2、enable_if

std::enable_if是C++标准库中的一个类型特性,当第一个模板参数为false的时候,enable_if<>::type不表示任何类型。以下是std::enable_if的简单实现:

template<bool B, typename T = void>
struct enable_if {};template<typename T>
struct enable_if<true, T> {using type = T;
};

这个实现定义了一个类模板enable_if,它有两个参数:bool B表示条件是否满足,typename T表示返回的类型(默认为void)。如果B为false,则不会定义type成员类型;否则,会定义type成员类型为T。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索 WebRTC:数字世界的实时通信魔法

前言 在当今日常生活中&#xff0c;我们期望能够随时随地与朋友、同事或家人进行实时沟通。WebRTC&#xff08;Web实时通信&#xff09;技术就像一种魔法&#xff0c;让这些交流变得无比便捷&#xff0c;而且完全在浏览器中实现&#xff0c;无需下载任何额外应用或插件。 Web…

Linux Ubuntu安装nodejs

nodejs官网 Linux 安装 node&#xff0c;npm &#xff08;详细图解&#xff09; 步骤 下载 wget https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz 解压 tar -xf node-v20.10.0-linux-x64.tar.xz 重命名 mv node-v20.10.0-linux-x64 node 进目录 cd node/b…

对接日志服务器系统,将业务服务器、数据库服务器等系统日志rsyslog统一推送或接入至日志服务器进行检测及日志的抓取分析。

1、客户端业务系统服务器配置&#xff0c;系统日志配置文件默认存放在/etc/rsyslog.conf下&#xff1b; 2、打开系统日志推送配置&#xff08;其它邮件日志、开机日志、消息日志等都可统一接入&#xff09; 3、配置推送地址和协议 这里特别说明一下&#xff1a;【注意&#xff…

stm32学习笔记:TIM-定时中断和外部时钟

定时器四部分讲解内容&#xff0c;本文是第一部分 ​​​​​TIM简介 基本定时器 时基单元&#xff1a;预分频器、计数器、自动重装载寄存器 预分频器之前&#xff0c;连接的就是基准计数时钟的输入&#xff0c;由于基本定时器只能选择内部时钟&#xff0c;所以可以认为这根…

Unity预设体

目录 预设体是什么&#xff1f; 如何创建预设体&#xff1f; 如何修改预设体&#xff1f; 如何删除预设体&#xff1f; 预设体是什么&#xff1f; Unity中的预设体&#xff08;Prefab&#xff09;是一种可重复使用的游戏对象模板。它允许开发者创建一个或多个游戏对象&…

ES实用的深度解构赋值方法

ES6 中允许按照一定模式&#xff0c;从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这被称为解构&#xff08;Destructuring&#xff09;。使用解构赋值可以将复杂的代码整理的更加干净整洁。 1.解构对象 在没有使用解构之前&#xff0c;想要确定对象中的某些属…

一篇了解Maven中的<optional>和<scope>使用

目录 Maven的依赖传递optional 与 scope 的区别scope 的可选值 Maven的依赖传递 依赖管理是maven提供的主要功能之一&#xff0c;无论我们需要什么依赖&#xff0c;只需将它们添加到 POM.xml 中&#xff0c;在构建或运行时所有必要的类和资源都会自动添加到项目的 classpath 中…

自己开发一种编程语言,可以同时开发鸿蒙,Android ios的三个平台的应用

我想要开发一种可以在&#xff0c;鸿蒙操作系统&#xff0c;Android操作系统&#xff0c;和ios操作系统运行的&#xff0c;编程语言,意思是自己开发一种编程语言,可以同时开发鸿蒙,Android ios的三个平台的应用,请问怎么实现,需要哪些技术,flutter为什么可以开发Android,ios应用…

DVWA靶场中的xss-反射型xss、存储型xss的low、medium、high的详细通关方法

目录 1.DVWA反射型xss &#xff08;1&#xff09;Low&#xff1a; &#xff08;2&#xff09;Medium&#xff1a; &#xff08;3&#xff09;Heigh 2.xss存储型 &#xff08;1&#xff09;Low&#xff1a; &#xff08;2&#xff09;Medium &#xff08;3&#xff09;He…

实现 Spring Boot 项目热重载,无需重启,省时省力

实现 Spring Boot 项目热重载&#xff0c;无需重启&#xff0c;省时省力 插件介绍 通过 JRebel 插件 实现 Spring Boot 项目热重载。类似于前端 Webpack 热重载功能 无需重启&#xff0c;省时省力 安装插件 打开 IDEA 在插件中搜索&#xff1a;JRebel 安装成功后重启IDEA …

1.SQL - 概述

1. SQL语句分类 • 数据定义语言&#xff1a;简称DDL(Data Definition Language)&#xff0c;用来定义数据库对象&#xff1a;数据库&#xff0c;表&#xff0c;列等。关键字&#xff1a;create&#xff0c;alter&#xff0c;drop等 • 数据操作语言&#xff1a;简称DML(Data …

一起玩儿物联网人工智能小车(ESP32)——17. 用ESP32的ADC功能读取电源电压

摘要&#xff1a;本文主要介绍如何使用ESP32的ADC功能&#xff0c;读取物联网智能小车的电池电压 今天介绍一个ESP32的新功能——如何利用ESP32的引脚&#xff0c;采集模拟量信息。在前面GPIO的学习中我们知道&#xff0c;可以利用GPIO的引脚读取外部设备输出的高低电平信号&am…

什么是LangChain

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 LangChain 是一个旨在简化使用大型语言模型&#xff08;LLM&#xff09;创建应用程序的框架。它提供了许多功能&#xff0c;使与LLM的合作变得更加容易&#xff0c…

【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:学会使用mybatis框架

上一篇文章中&#xff0c;我们学习了通过JDBC与MySQL进行交互。如果我们平常在项目中使用mybatis框架作为我们的orm框架。这一次我们就来学习如何使用框架。我们项目中使用到maven。我们直接通过pom文件的方式给他引入进来。 MyBatis是一个简单而强大的持久层框架&#xff0c;…

SParC数据集介绍

导语 SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。 SParC数据集概述 SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次&#xff0c;大约有12k的自然语言问句到SQL标注的Question-SQL对。这些问题来自于…

多汗症是否会遗传?

多汗症确实具有一定的遗传倾向。 首先&#xff0c;多汗症在临床上是比较常见的疾病&#xff0c;并且给生活带来了很多困扰。其中&#xff0c;许多患者多汗症是有遗传倾向的&#xff0c;即这个病本身就有遗传的一个几率。尤其是病理性多汗症&#xff0c;遗传的可能性更大。 具…

JavaWeb的Servlet的入门和使用方法

1 什么是Servlet Servlet是Server Applet的简称&#xff0c;是用Java编写的是运行在 Web 服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#xff0c;可以收集来自网页表单的用户输…

提升FTP上传速度的方法(提升FTP下载速度的技巧)

在企业日常经营中&#xff0c;快速上传和下载文件至关重要。然而&#xff0c;在使用FTP&#xff08;文件传输协议&#xff09;进行文件传输时&#xff0c;速度可能成为瓶颈。为了提升工作效率&#xff0c;以下是一些建议&#xff0c;可以帮助企业提高FTP上传下载速度。 1、确保…

BERT的学习

BERT 1.前言 self-supervised learning是一种无监督学习的特殊形式&#xff0c;算法从数据本身生成标签或者目标&#xff0c;然后利用这些生成的目标来进行学习。&#xff08;也就是说数据集的标签是模型自动生成的&#xff0c;不是由人为提供的。&#xff09;例如&#xff0…

万能刷题小程序源码系统:功能强大+试题管理+题库分类+用户列表 附带完整的搭建教程

随着互联网技术的不断进步&#xff0c;线上学习已成为越来越多人的选择。刷题作为提高学习效果的重要方式&#xff0c;一直受到广大学生的喜爱。然而&#xff0c;市面上的刷题软件虽然繁多&#xff0c;但功能各异&#xff0c;质量参差不齐&#xff0c;使得很多用户在选择时感到…