C++标准模板(STL)- 类型支持 (类型属性,is_abstract,is_signed,is_unsigned)

news2024/11/26 21:33:25

类型特性


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

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

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

类型属性

继承自 std::integral_constant

成员常量

value

[静态]

T 为抽象类类型则为 true ,否则为 false
(公开静态成员常量)
成员函数

operator bool

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

operator()

(C++14)

返回 value
(公开成员函数)
成员类型
类型定义
value_typebool
typestd::integral_constant<bool, value>

检查类型是否为抽象类类型

std::is_abstract

template< class T >
struct is_abstract;

(C++11 起)

T 为抽象类(即声明或继承至少一个纯虚函数的非联合类类型),则提供等于 true 的成员常量 value 。对于其他类型, value 为 false 。

T 是非联合类类型,则 T 应为完整类型;否则行为未定义。

模板形参
T-要检查的类型
辅助变量模板

template< class T >
inline constexpr bool is_abstract_v = is_abstract<T>::value;

(C++17 起)
 调用示例
#include <iostream>
#include <type_traits>

struct A
{
    int m;
};

struct B
{
    virtual void foo();
};

struct C
{
    virtual void foo() = 0;
};

struct D : C {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_abstract<int>::value:         "
              << std::is_abstract<int>::value << std::endl;
    std::cout << "std::is_abstract<double>::value:      "
              << std::is_abstract<double>::value << std::endl;
    std::cout << "std::is_abstract<std::string>::value: "
              << std::is_abstract<std::string>::value << std::endl;
    std::cout << "std::is_abstract<A>::value:           "
              << std::is_abstract<A>::value << std::endl;
    std::cout << "std::is_abstract<B>::value:           "
              << std::is_abstract<B>::value << std::endl;
    std::cout << "std::is_abstract<C>::value:           "
              << std::is_abstract<C>::value << std::endl;
    std::cout << "std::is_abstract<D>::value:           "
              << std::is_abstract<D>::value << std::endl;

    return 0;
}
输出

检查类型是否为有符号算术类型

std::is_signed

template< class T >
struct is_signed;

(C++11 起)

T 是算术类型且 T(-1) < T(0) ,则提供等于 true 的成员常量 value :这对于浮点类型和有符号整数类型产生 true ,并对无符号整数类型和 bool 类型产生 false

对于任何其他类型, value 为 false 。

模板形参
T-要检查的类型
辅助变量模板

template< class T >
inline constexpr bool is_signed_v = is_signed<T>::value;

(C++17 起)
可能的实现
namespace detail {
template<typename T,bool = std::is_arithmetic<T>::value>
struct is_signed : std::integral_constant<bool, T(-1) < T(0)> {};
 
template<typename T>
struct is_signed<T,false> : std::false_type {};
} // namespace detail
 
template<typename T>
struct is_signed : detail::is_signed<T>::type {};
调用示例
#include <iostream>
#include <type_traits>

class A {};
enum B : int {};
enum class C : int {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_signed<A>::value:             "
              << std::is_signed<A>::value << std::endl;
    std::cout << "std::is_signed<std::string>::value:   "
              << std::is_signed<std::string>::value << std::endl;
    std::cout << "std::is_signed<float>::value:         "
              << std::is_signed<float>::value << std::endl;
    std::cout << "std::is_signed<signed int>::value:    "
              << std::is_signed<signed int>::value << std::endl;
    std::cout << "std::is_signed<unsigned int>::value:  "
              << std::is_signed<unsigned int>::value << std::endl;
    std::cout << "std::is_signed<B>::value:             "
              << std::is_signed<B>::value << std::endl;
    std::cout << "std::is_signed<C>::value:             "
              << std::is_signed<C>::value << std::endl;

    // 简短的形式:
    std::cout << "std::is_signed<signed int>():         "
              << std::is_signed<signed int>() << std::endl;
    std::cout << "std::is_signed<unsigned int>():       "
              << std::is_signed<unsigned int>() << std::endl;

    return 0;
}
输出

检查类型是否为无符号算术类型

std::is_unsigned

template< class T >
struct is_unsigned;

(C++11 起)

T 是算术类型且 T(0) < T(-1) ,则提供等于 true 的成员常量 value :这对无符号整数类型和 bool 类型产生 true 并对有符号整数类型和浮点类型产生 false

对于任何其他类型, value 为 false 。

模板形参
T-要检查的类型
辅助变量模板

template< class T >
inline constexpr bool is_unsigned_v = is_unsigned<T>::value;

(C++17 起)
 可能的实现
namespace detail {
template<typename T,bool = std::is_arithmetic<T>::value>
struct is_unsigned : std::integral_constant<bool, T(0) < T(-1)> {};
 
template<typename T>
struct is_unsigned<T,false> : std::false_type {};
} // namespace detail
 
template<typename T>
struct is_unsigned : detail::is_unsigned<T>::type {};
调用示例
#include <iostream>
#include <type_traits>

class A {};
enum B : int {};
enum class C : int {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_unsigned<A>::value:             "
              << std::is_unsigned<A>::value << std::endl;
    std::cout << "std::is_unsigned<std::string>::value:   "
              << std::is_unsigned<std::string>::value << std::endl;
    std::cout << "std::is_unsigned<float>::value:         "
              << std::is_unsigned<float>::value << std::endl;
    std::cout << "std::is_unsigned<signed int>::value:    "
              << std::is_unsigned<signed int>::value << std::endl;
    std::cout << "std::is_unsigned<unsigned int>::value:  "
              << std::is_unsigned<unsigned int>::value << std::endl;
    std::cout << "std::is_unsigned<B>::value:             "
              << std::is_unsigned<B>::value << std::endl;
    std::cout << "std::is_unsigned<C>::value:             "
              << std::is_unsigned<C>::value << std::endl;

    // 简短的形式:
    std::cout << "std::is_unsigned<signed int>():         "
              << std::is_unsigned<signed int>() << std::endl;
    std::cout << "std::is_unsigned<unsigned int>():       "
              << std::is_unsigned<unsigned int>() << std::endl;

    return 0;
}
输出

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

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

相关文章

Qt学习:图形视图框架的使用

文章目录 前言一、场景、视图和图形项的介绍二、图形视图框架的坐标系统三、图形视图框架的事件处理四、示例完整代码五、QtCreator官方示例总结 前言 近期重温了一下Qt中的图形视图框架&#xff0c;这里将所学习的内容进行记录总结。这个框架提供了一个基于图形项的模型视图编…

基于match_phrase搜索的分词优化

ES 的match_phrase 搜索需要完整匹配输入的内容&#xff0c;比如我们搜索 ‘中国人民’ &#xff0c;要保证的是doc中必须有 ‘中国人民’ 的内容出现。再比如我们搜索 ‘国人民’ 时&#xff0c;结果集中的 doc 中就要有 ‘国人民’ 的内容。一般在使用match 或 term 搜索的时…

DL Homework 6

目录 一、概念 &#xff08;1&#xff09;卷积 &#xff08;2&#xff09;卷积核 &#xff08;3&#xff09;特征图 &#xff08;4&#xff09;特征选择 &#xff08;5&#xff09;步长 &#xff08;6&#xff09;填充 &#xff08;7&#xff09;感受野 二、探究不同卷…

植物花粉深度学习图片数据集大合集

最近收集了一波有关于植物花粉的图片数据集&#xff0c;可以用于相关深度学习模型的搭建&#xff0c;废话不多说&#xff0c;上数据集&#xff01;&#xff01;&#xff01; 1、23种花粉类型805张花粉图像数据集 关于此数据&#xff1a;花粉种类和类型的分类是法医抱粉学、考…

2023年中国金融控股公司研究报告

第一章 行业概况 1.1 定义 金融控股公司这一术语最初源自美国&#xff0c;特别是在美国的《金融服务法案》关于银行控股公司组织结构的条文中&#xff0c;首次出现了“金融控股公司”&#xff08;Financial Holding Company&#xff09;这一法律术语&#xff0c;尽管法案中并…

2023年【高压电工】报名考试及高压电工最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新高压电工最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过高压电工作业考试题库很简单。 1、【单选题】 ()是指继电器不动作时处于…

Windows 内置Linux子系统的配置(From WSL1 to WSL2)

目录 我是如何从WSL1转到WSL2的? WSL1与WSL2的功能区别: 配置下载源 SSH配置 优雅使用windows的Linux子系统 我是如何从WSL1转到WSL2的? 第一次安装的子系统是WSL1的&#xff0c;因为不能使用systemctl &#xff0c;以及因为WSL1没有完整的Linux内核,所以使得WSL1很多命令…

vivado查看报告和消息1

AMD Vivado ™ 集成设计环境 (IDE) 可生成报告和消息 &#xff0c; 以便告知您各种工具交互期间的设计或设计进程状态。报告由 您&#xff08; 或工具 &#xff09; 在执行设计流程中的任意关键步骤时生成。报告可汇总有关设计的具体信息。 本工具可在设计进程中每个步骤自动…

软通杯算法竞赛--周赛题目(一)

目录 一、S属性大爆发 二、日期杯 三、 三人行必由我师 四、集合之差 五、咱们计算机不懂烷烃 六、适度跑步健康长寿 一、S属性大爆发 测试用例 5 esS qwert codeforces PoSgju LkkJKkO 输出案例 二、日期杯 输入案例&#xff1a; 3 2022 2022 11 1900 2100 15 1989 20…

EtherCAT主站写从站EEPROM抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文主站设置从站1字地址为0的EEPROM数据为0x3C00&#xff08;设置完毕后请还原字0的EEPROM数据&#xff09;&#xff0c;使用Wireshark抓取到…

检索已删除的视频方法,12 个最佳 Android 视频恢复应用程序/软件

您可能倾向于定期从 Android 设备中删除不必要的视频&#xff0c;同时保留精美的视频以使其保持井井有条。然而&#xff0c;有些人在删除一些有价值的视频而不是无用的视频时无意中犯了错误。如果您错误地从移动设备中删除了视频或清除了其内存&#xff0c;您可能想知道是否有办…

某大厂伺服驱动器量产方案

本文介一款大厂量产伺服驱动器方案&#xff01;带2500线省线式编码器&#xff0c;17位增量编码器&#xff0c;20位绝对值编码器&#xff01;标配CANopen、高精度运动控制&#xff0c;高速总线通讯&#xff0c;主芯片28335FPGA&#xff0c;已验证过&#xff0c;带can和485通讯&a…

OSError: libomp.so: cannot open shared object file: No such file or directory

报错&#xff1a;OSError: libomp.so: cannot open shared object file: No such file or directory https://stackoverflow.com/questions/52401840/what-is-the-ctypes-cdll-default-path 没有libomp.so 总算找到啦&#xff01;链接 export LD_LIBRARY_PATH/usr/lib/llvm…

【java学习—十二】文件字符流(3)

文章目录 1. 文件字符输入流2. 文件字符输出流3. 字符流完成拷贝文件 1. 文件字符输入流 读取文件操作步骤 : &#xff08;1&#xff09;建立一个流对象&#xff0c;将已存在的一个文件加载进流。 FileReader fr new FileReader(“Test.txt”);&#xff08;2&#xff09;创建…

C站你好,和你相遇的第1825天

文章目录 机缘收获日常成就憧憬 机缘 ①. 你好,C站 ②. 初识JAVA编程,遇到问题,粘贴问题百度搜索,大都数出来的解决方案都能在C站得到解决,对C站有一定的好感 ③. 起初在CSDN写博客,主要用来记录日常学习过程中的笔记、不断调整自己的笔记,如JAVA基础、框架、虚拟机等,为后…

【Linux】搭建Linux环境等——小喵爱上了林利克斯1

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Elasticsearch:使用你的 RAG 来进行聊天

什么是人工智能中的检索增强生成&#xff08;RAG&#xff09;&#xff1f; 检索增强生成 (RAG)&#xff0c;与你的文档聊天的超级英雄&#xff0c;架起信息检索和文本生成世界的桥梁&#xff01; 这就像福尔摩斯和莎士比亚联手解决需要大量知识的复杂任务。 RAG 突然介入&…

分享96个工作总结PPT,总有一款适合您

分享96个工作总结PPT&#xff0c;总有一款适合您 工作总结PPT下载链接&#xff1a;https://pan.baidu.com/s/18AriuVGxwINHrmgndX74dw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

【数智化案例展】新余钢铁集团——华院智能配煤解决方案

‍ 华院计算案例 本项目案例由华院计算投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 华院智能制造基于对工业生产场景的深入理解&#xff0c;秉承算法和应用场景相结合…

2023年金融科技建模大赛(初赛)开箱点评

各位同学大家好&#xff0c;我是Toby老师。2023年金融科技建模大赛&#xff08;初赛&#xff09;从今年10月14日开始&#xff0c;11月11日结束。 比赛背景 发展数字经济是“十四五”时期的重大战略规划。2023年&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》…