C++标准模板(STL)- 类型支持 (类型关系,检查两个类型是否相同,std::is_same)

类型特性


类型特性
类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。

类型关系

继承自 std::integral_constant

成员常量

value

[静态]

TU 是同一类型则为 true ,否则为 false
(公开静态成员常量)

成员函数

operator bool

转换对象为 bool ,返回 value
(公开成员函数)

operator()

(C++14)

返回 value
(公开成员函数)

成员类型

类型定义
value_typebool
typestd::integral_constant<bool, value>

检查两个类型是否相同

std::is_same

template< class T, class U >
struct is_same;

(C++11 起)

TU 指名同一类型(考虑 const/volatile 限定),则提供等于 true 的成员常量 value 。否则 value 为 false 。

满足交换律,即对于任何二个类型 TU , is_same<T, U>::value == true 当且仅当 is_same<U, T>::value == true 。

辅助变量模板

template< class T, class U >
inline constexpr bool is_same_v = is_same<T, U>::value;

(C++17 起)

可能的实现

template<class T, class U>
struct is_same : std::false_type {};template<class T>
struct is_same<T, T> : std::true_type {};

调用示例

#include <iostream>
#include <type_traits>
#include <cstdint>class A
{
public:A() {}
};class B : public A
{
public:B() {}
};int main()
{std::cout << std::boolalpha;// 一些实现定义状况std::cout << "std::is_same<int, std::int32_t>::value:   "<< std::is_same<int, std::int32_t>::value << std::endl;// 若 'int' 为 32 位则通常为 truestd::cout << "std::is_same<int, std::int64_t>::value:   "<< std::is_same<int, std::int64_t>::value << std::endl;// 若使用 ILP64 数据模型则可能为 truestd::cout << "-----------------------------------------------" << std::endl;// 'float' 决非整数类型std::cout << "std::is_same<float, std::int32_t>::value: "<< std::is_same<float, std::int32_t>::value << std::endl; // falsestd::cout << "-----------------------------------------------" << std::endl;// 'int' 为隐式的 'signed'std::cout << "std::is_same<int, int>::value:            "<< std::is_same<int, int>::value << std::endl;        // truestd::cout << "std::is_same<int, unsigned int>::value:   "<< std::is_same<int, unsigned int>::value << std::endl; // falsestd::cout << "std::is_same<int, signed int>::value:     "<< std::is_same<int, signed int>::value << std::endl; // truestd::cout << "-----------------------------------------------" << std::endl;// 不同于其他类型, 'char' 既非 'unsigned' 亦非 'signed'std::cout << "std::is_same<char, char>::value:          "<< std::is_same<char, char>::value << std::endl;        // truestd::cout << "std::is_same<char, unsigned char>::value: "<< std::is_same<char, unsigned char>::value << std::endl; // falsestd::cout << "std::is_same<char, signed char>::value:   "<< std::is_same<char, signed char>::value << std::endl; // falsestd::cout << "-----------------------------------------------" << std::endl;std::cout << "std::is_same<A, A>::value:                "<< std::is_same<A, A>::value << std::endl; // falsestd::cout << "std::is_same<A, B>::value:                "<< std::is_same<A, B>::value << std::endl; // falsestd::cout << "std::is_same<A(), B()>::value:            "<< std::is_same<A(), B()>::value << std::endl; // falsereturn 0;
}

输出

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

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

相关文章

【Redux】Redux 基本使用

1. Redux 快速上手 Redux 是 React 最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行。 <button id"decrement">-</button> <span id"count">0</span> <…

Java - 位运算的基本原理和用途

Java - 位运算的基本原理和用途 前言一. Java 位运算基本操作1.1 按位与 &1.2 按位或 |1.3 按位异或 ^1.4 按位取反 ~1.5 位移运算1.5.1 左移运算符 <<1.5.2 右移运算符 >>1.5.3 无符号右移运算符 >>> 二. 位运算实际运用2.1 判断奇偶性&#xff08;&…

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08 这个功能大家还熟悉么&#xff1f;我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我&#xff01;&#xff01;&#xff01;不是让大家记住我哈。 值得一提的是&#xff0c;Spring Security 也提供了这个…

(C++)字符串相加

愿所有美好如期而遇 题目链接&#xff1a;415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09; 思路 我们看到字符串长度可能到达一万&#xff0c;而且不允许使用处理大整数的库&#xff0c;也就是说&#xff0c;转成整数相加后再转成字符串是不可行的。 那么我们就让…

LCD1602显示自定义字符

代码&#xff1a; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); //根据lcd1602的地址修改0x27. dht DHT; byte degree[8] {B00100, B01010, B10001, B10101, B10101, B01110, B00100,B00100 }; //自定义字符的2进制数据 byte customCh…

从0开始学习JavaScript--JavaScript 数字与日期

JavaScript中的数字和日期是处理数值计算和时间相关任务的核心。本文将深入研究JavaScript中数字的表示、常见运算&#xff0c;以及日期对象的创建、格式化等操作&#xff0c;并通过丰富的示例代码&#xff0c;可以更全面地了解和应用这些概念。 JavaScript数字基础 JavaScri…

Shell脚本:Linux Shell脚本学习指南(第一部分Shell基础)一

你好&#xff0c;欢迎来到「Linux Shell脚本」学习专题&#xff0c;你将享受到免费的 Shell 编程资料&#xff0c;以及很棒的浏览体验。 这套 Shell 脚本学习指南针对初学者编写&#xff0c;它通俗易懂&#xff0c;深入浅出&#xff0c;不仅讲解了基本知识&#xff0c;还深入底…

Python中,我们可以使用pandas和numpy库对Excel数据进行预处理,包括读取数据、数据清洗、异常值剔除等

文章目录 一、什么是数据预处理二、对excel数据进行详细的数据预处理操作总结 一、什么是数据预处理 数据预处理是一种对数据进行清洗、整理、转换等操作的过程&#xff0c;旨在提高数据质量&#xff0c;使其适应模型的需求&#xff0c;从而改进数据挖掘或机器学习的结果。 数…

如何在企业签名、超级签名、tf签名之间做选择

企业签名 (Enterprise Signing): 用途&#xff1a; 适用于企业内部发布应用&#xff0c;不需要经过App Store审核&#xff0c;可以通过企业内部渠道直接分发给员工或内部用户。限制&#xff1a; 仅限于企业内部使用&#xff0c;无法在App Store上发布或向外部用户分发。 超级签…

Alien Skin Exposure2024胶片滤镜中文免费版插件

Exposure是一个在你的照片上实现完整个人看法的终极工具。它是一个完整、强大、多才多艺的照片编辑器和组织者&#xff0c;并且带有你在市场上任何软件中都找不到的独特功能。 Alien Skin Exposure是我处理图片主要的一款软件。Exposure整体界面非常直观&#xff0c;而且操作易…

Linux常用命令——bye命令

在线Linux命令查询工具 bye 命令用于中断FTP连线并结束程序。。 补充说明 bye命令在ftp模式下&#xff0c;输入bye即可中断目前的连线作业&#xff0c;并结束ftp的执行。 语法 bye实例 bye在线Linux命令查询工具

多线程Thread(初阶一:认识线程)

目录 一、引用线程的原因 二、线程的概念 三、进程和线程的区别 四、多线程编程 一、引用线程的原因 多任务操作系统&#xff0c;希望系统能同时运行多个任务。所以会涉及到进程&#xff0c;需要对进程进行管理、调度等。 而单任务操作系统&#xff0c;就完全不涉及到进程…