【模板进阶】std::true_type和std::false_type

news2024/11/24 0:35:30

一、 s t d : : t r u e _ t y p e std::true\_type std::true_type s t d : : f a l s e _ t y p e std::false\_type std::false_type的实现

s t d : : t r u e _ t y p e std::true\_type std::true_type s t d : : f a l s e _ t y p e std::false\_type std::false_type实际上是类型别名,经常被使用到。

例如标准库有以下的代码:

在这里插入图片描述
所以,它们实际上是同一个类型的两种特化版本的别名,可以看作是两个类型,也可以看作是一个类型。


下面是 s t d : : t r u e _ t y p e std::true\_type std::true_type s t d : : f a l s e _ t y p e std::false\_type std::false_type的具体实现代码:

//std::true_type和std::false_type的实现代码


template<bool val>
struct BoolConstant {
	using type = BoolConstant;
	
	static constexpr bool value = val;
};

using TrueType = BoolConstant<true>; //相当于std::true_type
using FalseType = BoolConstant<false>;//相当于st::false_type

实际上,这两个类型和 t r u e / f a l s e true/false true/false很类似,实际上就是用一个类来包装它们。
这样的包装有很多好处,比如可以用于作为返回值,也可以作为类被继承等等,下面详细介绍。


二、 s t d : : t r u e _ t y p e std::true\_type std::true_type s t d : : f a l s e _ t y p e std::false\_type std::false_type的用途

2.1 作为返回值使用

考虑以下两个函数:

using TrueType = BoolConstant<true>; //相当于std::true_type
using FalseType = BoolConstant<false>;//相当于st::false_type

//作为返回值来使用
FalseType myfunc1() {

	return FalseType();
}

TrueType myfunc2() {

	return TrueType();
}

void Test1() {
	std::cout << myfunc1().value << "\n";

	std::cout << myfunc2().value << "\n";
	
}

其中一个函数始终返回一个包装 t r u e true true的类,另一个函数返回包装 f a l s e false false的类。


2.2 条件判断,不同类型赋值不同的值

考虑以下的代码:

//条件判断,不同类型赋值不同的值
template<typename T,bool val>
struct AClass {
	AClass() {
		std::cout << "AClass::AClass()执行了!\n";
		//这样编译失败,因为无法确定调用哪一个分支,所以会实例化出所有分支
		if (val) {
			T tmpa = 15;
		}
		else {
			T tmpa = "abc";
		}
};

这样的代码一定会编译失败,因为 i f if if无法在编译期间得到确定,因此全部分支都会被实例化出来。


我们可以考虑使用编译期间的条件分支 i f   c o n s t e x p r if \ constexpr if constexpr来避免这个问题:

//条件判断,不同类型赋值不同的值
template<typename T,bool val>
struct AClass {
	AClass() {
		std::cout << "AClass::AClass()执行了!\n";
		//使用if constexpr在编译期间确定使用的分支
		if constexpr (val) {
			T tmpa = 15;
			std::cout << "tmpa = " << tmpa << "\n";
		}
		else {
			T tmpa = "abc";
			std::cout << "tmpa = " << tmpa << "\n";
		}
	}
};

当然,我们可以使用 s t d : : t r u e _ t y p e std::true\_type std::true_type s t d : : f a l s e _ t y p e std::false\_type std::false_type来达到一样的效果,如下:

template<typename T,bool val>
struct AClass {
	//使用TrueType和FalseType来实现
	AClass() {
		std::cout << "AClass::AClass()执行了!\n";
		AClassEx(BoolConstant<val>()); //临时变量,根据重载的函数来具体实例化
	}

	void AClassEx(TrueType) {
		T tmpa = 15;
		std::cout << "tmpa = " << tmpa << "\n";
	}
	
	void AClassEx(FalseType) {
		T tmpa = "abc";
		std::cout << "tmpa = " << tmpa << "\n";
	}

};

void Test2() {
	AClass<int, true>a1;
	AClass<std::string, false>a2;
	
}

这里同样是在编译期间确定的,因此,如果 v a l val val t r u e true true就调用 T r u e T y p e TrueType TrueType类型的函数,反之调用 F a l s e T y p e FalseType FalseType的函数,这其实利用到了函数重载。

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

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

相关文章

Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)

反向代理与跨域描述 什么是跨域&#xff1f; 跨域&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;是指在浏览器中&#xff0c;当一个网页的脚本试图从一个域名&#xff08;协议、域名、端口&#xff09;请求另一个域名的资源时&#xff0c;浏览器会阻止这种请求…

php常用的注释符号

如果没有安装vscode和小皮&#xff0c;请点击下方链接安装&#xff1a; Vscode、小皮面板安装-CSDN博客 在学习php过程中&#xff0c;肯定少不了注释&#xff0c;也可以理解为备注的信息&#xff0c;来提醒自己这段代码有什么用&#xff0c;是什么意思等&#xff0c;接下来就介…

JS测试框架——Jest

文章目录 安装yarn安装jestvscode支持jest的智能提示创建JS测试用例 安装yarn yarn是meta发布的一款取代npm的包管理工具。 npm install -g yarn查看yarn软件源 yarn config get registry换源 yarn config set registry https://registry.npmmirror.com恢复官方源 yarn co…

详细分析Spring Security OAuth2中的JwtAccessTokenConverter基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 JwtAccessTokenConverter 是 Spring Security OAuth2 中的一…

【NoSQL】portswigger NoSQL注入 labs 全解

目录 NoSQL NoSQL 数据库模型 NoSQL 注入的类型 NoSQL 语法注入 检测 MongoDB 中的语法注入 lab1:检测 NoSQL 注入 NoSQL 运算符注入 提交查询运算符 检测 MongoDB 中的运算符注入 lab2:利用 NoSQL 运算符注入绕过身份验证 利用语法注入来提取数据 MongoDB 中的数据…

华为---MUX VLAN简介及示例配置

目录 1. 产生背景 2. 应用场景 3. 主要功能 4. 基本概念 5. 配置步骤及相关命令 6.示例配置 6.1 示例场景 6.2 网络拓扑图 6.3 配置代码 6.4 配置及解析 6.5 测试验证 配置注意事项 1. 产生背景 MUX VLAN&#xff08;Multiplex VLAN&#xff09;提供了一种通过VLA…

【C++力扣】917.仅仅反转字母|387.字符串中第一个唯一字符|415.字符串相加

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 一、917.仅仅反转字母 1.1 题目描述…

VMware tools菜单为灰色无法安装

这个工具之前为灰色&#xff0c;无法安装&#xff0c;导致无法实现跟主机的共享文件夹等操作。极为不便。 根据其他教程提示&#xff1a;看到软件是这个配置。 修改为自动检测&#xff0c;tools就可以安装了。之前没注意到。 也有说dvd光盘也要设置。但是经过我测试。只设置软…

各省份消费差距(城乡差距)数据(2005-2022年)

消费差距&#xff0c;特别是城乡消费差距&#xff0c;是衡量一个国家或地区经济发展均衡性的重要指标。 2005年-2022年各省份消费差距&#xff08;城乡差距&#xff09;数据&#xff08;大数据&#xff09;.zip资源-CSDN文库https://download.csdn.net/download/2401_84585615/…

谷粒商城のRabbitMQ基础篇

文章目录 前言一、Rabbit MQ简介1、基本概念2、组件架构 二、使用步骤1.引入依赖2.application.properties3、docker 安装Rabbit MQ3、使用案例3.1、定义队列3.2、定义交换机3.3、绑定3.4、发送消息3.5、接受消息3.5、自定义消息序列化方式3.6、演示Fanout 交换机模式3.7、演示…

总结TypeScript相关知识

目录 引入认识特点安装使用变量声明类型推导 JS 和 TS 共有类型number类型boolean类型string类型Array类型null和undefined类型object类型symbol类型对象类型函数类型 可选和只读type 和 interface索引签名类型断言非空类型断言类型缩小严格赋值检测现象TS 新增类型字面量类型a…

[统计分析] 出现典型锯齿图的一种情况;资源泄露

接上回说&#xff0c;https://mzhan017.blog.csdn.net/article/details/142689870&#xff1b; 在问题分析的过程中发现产品里的一个统计计数出现了下面的锯齿型。而这个问题的表象之一是每隔一段时间&#xff0c;业务程序重启。所以产生这个锯齿形的原因之一就是业务程序重启&…

【C++ STL算法】二分查找 lower_bound、upper_bound、equal_range、binary_search

文章目录 【 1. 首个不小于 lower_bound 】【 2. 首个大于 upper_bound 】【 3. 所有等于 equel_range 】【 4. 二分查找 binary_search 】 当 指定区域内的数据处于有序状态 时&#xff0c;如果想查找某个目标元素&#xff0c;更推荐使用二分查找的方法&#xff08;相比顺序查…

openpnp - juki吸嘴尺寸

文章目录 openpnp - juki吸嘴尺寸概述笔记吸嘴可以对应的最小元件尺寸END openpnp - juki吸嘴尺寸 概述 在网上买的juki吸嘴的商品页面&#xff0c;并没有具体的吸嘴尺寸。 现在贴片时&#xff0c;要根据吸嘴外径大小来决定具体元件要用哪种吸嘴&#xff0c;先自己量一下。 …

研究生系统化入门教程(四)【机器学习】分类算法:决策树(信息熵,信息增益);集成学习方法之随机森林:估计器的工作流程是什么?为何采用BootStrap抽样?

“一般人都不是他们想要做的那种人,而是他们不得不做的那种人。——毛姆《月亮与六便士》” 🎯作者主页: 追光者♂🔥 🌸个人简介: 📝[1] CSDN 博客专家📝 🏆[2] 人工智能领域优质创作者🏆 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 �…

鸿蒙next开发第一课03.ArkTs语法介绍-案例

前面已经学习了ArkTs的基本语法和DevEcoStudio的基本操作&#xff0c;接下来按照官方提示开发一个基本案例。 该案例是系统自带的demo&#xff0c;下载下来源代码后可以直接运行。 接下来我来演示如何运行demo。我在demo中加入了自己的注释。 切记&#xff1a;文件夹不能有中…

Crypto虐狗记---”你“和小鱼(七)

前言&#xff1a;剧情七 提示&#xff1a; 下载&#xff1a; 脚本&#xff1a; cyberpeace{125631357777427553} RSA算法_百度百科 (baidu.com)

VMware Tools 安装和配置

1. 使用 ISO 映射文件&#xff0c;并且选择.iso文件 2. 启动虚拟机&#xff0c;如果 VMware Tools 是灰色的&#xff0c;那么卸载 open-vm-tools&#xff08;不要重装&#xff09;&#xff0c;重新启动虚拟机。卸载可以参考&#xff1a;重装 open-vm-tools-CSDN博客 3. 拷贝挂载…

[C++]使用纯opencv部署yolov8-cls图像分类onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv8-cls图像分类ONNX模型涉及几个关键步骤。 首先&#xff0c;你需要将YOLOv8-cls模型从PyTorch格式转换为ONNX格式&#xff0c;这是为了确保模型在不同深度学习框架之间的互操作性。这个转换过程通常是通过ultralytics框架中的model.export…

请求响应-08.响应-案例

一.案例 获取员工数据&#xff0c;返回统一响应结果&#xff0c;在页面上渲染展示 二.展示最终效果 三.步骤 步骤一&#xff1a; <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3<…