C++标准模板(STL)- 类型支持 (复合类型类别,is_member_pointer,is_reference,is_compound)

news2025/7/21 19:26:12

类型特性


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

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

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

类型属性


定义于头文件 <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_compound

template< class T >
struct is_compound;

(C++11 起)

T 是复合类型(即数组、函数、对象指针、函数指针、成员对象指针、成员函数指针、引用、类、联合体或枚举,含任何 cv 限定变体),则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

template< class T >
inline constexpr bool is_compound_v = is_compound<T>::value;

(C++17 起)
注意

复合类型是从基础类型构造的类型。任何 C++ 类型为基础或复合之一。

可能的实现
template< class T >
struct is_compound : std::integral_constant<bool, !std::is_fundamental<T>::value> {};
调用示例
#include <iostream>
#include <type_traits>

int main()
{
    class cls {};
    std::cout << "cls:      "
              << (std::is_compound<cls>::value
                  ? "T is compound"
                  : "T is not a compound") << std::endl;
    std::cout << "int:      "
              << (std::is_compound<int>::value
                  ? "T is compound"
                  : "T is not a compound") << std::endl;

    return 0;
}
输出

 

检查类型是否为左值引用或右值引用

std::is_reference

template< class T >
struct is_reference;

(C++11 起)

T 是引用类型(左值引用或右值引用),则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

template< class T >
inline constexpr bool is_reference_v = is_reference<T>::value;

(C++17 起)
 可能的实现
template <class T> struct is_reference      : std::false_type {};
template <class T> struct is_reference<T&>  : std::true_type {};
template <class T> struct is_reference<T&&> : std::true_type {};
调用示例
#include <type_traits>

class A {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_reference<A>::value:          "
              << std::is_reference<A>::value << std::endl;
    std::cout << "std::is_reference<A&>::value:         "
              << std::is_reference<A&>::value << std::endl;
    std::cout << "std::is_reference < A&& >::value:     "
              << std::is_reference < A&& >::value << std::endl;
    std::cout << "std::is_reference<int>::value:        "
              << std::is_reference<int>::value << std::endl;
    std::cout << "std::is_reference<int&>::value:       "
              << std::is_reference<int&>::value << std::endl;
    std::cout << "std::is_reference < int&& >::value:   "
              << std::is_reference < int&& >::value << std::endl;

    return 0;
}
输出

 

 

检查类型是否为指向非静态成员函数或对象的指针类型

std::is_member_pointer

template< class T >
struct is_member_pointer;

(C++11 起)

T 为指向非静态成员对象或非静态成员函数的指针,则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

template< class T >
inline constexpr bool is_member_pointer_v = is_member_pointer<T>::value;

(C++17 起)
可能的实现
template< class T >
struct is_member_pointer_helper         : std::false_type {};
 
template< class T, class U >
struct is_member_pointer_helper<T U::*> : std::true_type {};
 
template< class T >
struct is_member_pointer : 
is_member_pointer_helper<typename std::remove_cv<T>::type> {};
调用示例
#include <iostream>
#include <type_traits>

int main()
{
    class cls {};
    std::cout << "int(cls::*):          "
              << (std::is_member_pointer<int(cls::*)>::value
                  ? "T is member pointer"
                  : "T is not a member pointer") << std::endl;
    std::cout << "int:                  "
              << (std::is_member_pointer<int>::value
                  ? "T is member pointer"
                  : "T is not a member pointer") << std::endl;

    return 0;
}
输出

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

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

相关文章

职场好物:乐歌M9S升降办公电脑台,告别久坐办公,升职加薪就选它

办公是现代生活不可避免的组成部分&#xff0c;科技的快速发展&#xff0c;给了我们更多新的生活方式&#xff0c;促使我们更加关注自己的身体状况&#xff0c;我们挨过了饭都吃不饱的年代&#xff0c;随着办公人群的不断扩张&#xff0c;不知道你有没有发现身边人或多或少都有…

代码随想录算法训练营第三十九天 | LeetCode 343. 整数拆分、96. 不同的二叉搜索树

代码随想录算法训练营第三十九天 | LeetCode 343. 整数拆分、96. 不同的二叉搜索树 文章链接&#xff1a;整数拆分 不同的二叉搜索树 视频链接&#xff1a;整数拆分 不同的二叉搜索树 1. LeetCode 343. 整数拆分 1.1 思路 给我们一个数&#xff0c;如何去拆成若…

力扣第62题 不同路径 c++ 动态规划 dp二维 + dp一维 解法

题目 62. 不同路径 中等 相关标签 数学 动态规划 组合数学 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Fini…

Kubernetes异常?别担心,100个命令来解救你

关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 这篇文章是关于使用 Kubectl 进行 Kubernetes 诊断的指南。作者列出了 100 个 Kubectl 命令&#xff0c;这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于&#xff1a; 集群信息Pod 诊断服务诊断…

一款成熟的文件外发审计管控系统,应该具备哪些价值?

在信息化高速发展的时代&#xff0c;电子文件泄密事件层出不穷&#xff0c;比如文本文档、图像、音频、视频、电子表格等&#xff0c;都是日常会接触到的文件类型。像制造业企业&#xff0c;会有比较多的上下游协作交流&#xff0c;外发的电子文档以明文的形式提供给合作伙伴&a…

信号类型(通信)——QAM调制信号

系列文章目录 《信号类型&#xff08;通信&#xff09;——仿真》 文章目录 前言 一、原理图 二、仿真 2.1、QAM仿真 2.2、不同滚降系数 2.3、不同M下QAM调制对比 总结 前言 本文主要结合仿真分析了QAM的信号处理过程&#xff0c;并简单分析了成型滤波器中的滚降系数对QA…

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、简单使用1.First、在project下的build.gradle添加2.按需导入3. 常用代码 rtsp流的优化大功告成 总结 前言 本文介绍&#xff0c;…

Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器

文章目录 引言Kafka Eagle简介Kafka Eagle的特点Kafka Eagle的优势使用Kafka Eagle的步骤结论 引言 在现代大数据架构中&#xff0c;Apache Kafka已成为一个不可或缺的组件&#xff0c;用于可靠地处理和传输大规模的数据流。然而&#xff0c;随着Kafka集群规模的不断增长&…

私募证券基金动态-23年9月报

成交量&#xff1a;9月日均7,197.15亿元 2023年9月A股两市日均成交7,197.15亿元&#xff0c;环比下降12.78%、同比下降1.38%&#xff0c;为近2年单月日均成交最低的月份。9月整体20个交易日&#xff0c;单日成交金额最高没有过万亿&#xff0c;单日最低破6000亿&#xff0c;仅…

博弈论学习笔记(2)——完全信息静态博弈

前言 这部分我们学习的是完全信息静态博弈&#xff0c;主要内容包括博弈论的基本概念、战略式博弈、Nash均衡、Nash均衡解的特性、以及Nash均衡的应用。 零、绪论 1、什么是博弈论 1&#xff09;博弈的定义 博弈论&#xff1a;研究决策主体的行为发生直接相互作用时候的决策…

蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)

目录 1、求和 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 1、求和 题目&#xff1a; 思路&#xff1a; 1、首先想到的是两重遍历&#xff0c;累加和。但是当n取200000时&#xff0c;会超时&#xff0c;所以暴力的遍历没有办法通过全部案例。 2、将公式变形得到…

AI先行者第一辑:AI for Science 要坚持高压强投入

‍‍ 中国在AI for Science的基础还非常的薄弱&#xff0c;且非短期内可以提升&#xff0c;需要有一个长期性的计划&#xff0c;也需要有足够的金钱投入和人才队伍建设。 本篇作者褚学森&#xff0c;中国船舶科学研究中心、深海技术科学太湖实验室 研究员&#xff1b;新兴技术研…

代码随想录算法训练营第四十天丨 动态规划part03

343. 整数拆分 思路 看到这道题目&#xff0c;都会想拆成两个呢&#xff0c;还是三个呢&#xff0c;还是四个.... 来看一下如何使用动规来解决。 动态规划 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]…

DNS 域名解析系统

文章目录 前言什么是 DNS 域名解析系统为什么需要 DNS 域名解析DNS 是如何发展的hosts 文件维护域名和IP的映射关系DNS 系统&#xff08;服务器&#xff09;DNS 镜像系统 前言 前面为大家分享了关于计算机网络中应用层——自定义协议、传输层——UDP、TCP 协议、网络层——IP协…

怎样用ps把人物皮肤磨皮,人物皮肤磨皮怎么办

品牌型号:联想GeekPro 2020 系统: Windows 10 64位专业版 软件版本: portraiture 3.5.6 皮肤瑕疵是人像拍摄中比较容易出现的问题&#xff0c;对于皮肤瑕疵后期一般会使用磨皮的方法处理。那么&#xff0c;怎样用ps把人物皮肤磨皮&#xff1f;ps磨皮的工具丰富多样&#xff…

如何在不同的系统中查找IP地址

知道如何找到你的IP地址是我们大多数人在日常生活中很少使用的技能&#xff0c;但当你需要的时候&#xff0c;这是一种你会感激的技能——尤其是如果你运行的是最好的Wi-Fi路由器之一。 当你从事家庭网络项目时&#xff0c;知道你的IP地址很重要&#xff0c;一旦你知道了基本知…

倾斜摄影三维模型数据几何坐标重建方法分析

倾斜摄影三维模型数据几何坐标重建方法分析 利用几何坐标变换等技术实现倾斜摄影三维模型数据的坐标重建&#xff0c;可以采用以下方法&#xff1a; 1、数据准备&#xff1a;首先&#xff0c;需要获取倾斜摄影影像数据。这些影像应包含多个视角下的拍摄图像&#xff0c;并覆盖…

docker--基本操作

第 1 章 Docker基础 1.1 docker简介 在这一部分我们主要讲两个方面&#xff1a; docker是什么、docker特点 1.1.1 docker是什么 docker是什么&#xff1f; docker的中文解释是码头工人。 官方解释&#xff1a; Docker是一个开源的容器引擎&#xff0c;它基于LCX容器技术&…

最新广告联盟系统源码/实时监控移动广告联盟系统/多元化合作推广方式+支持各种广告效果

源码简介&#xff1a; 最新广告联盟系统源码&#xff0c;作为实时监控移动广告联盟&#xff0c;它有着多元化合作推广方式&#xff0c;并支持各种广告效果。它是最新版本、功能强大的广告联盟系统。 诚丰广告联盟系统的单台服务器每天能够承受至少2000万个PV流量&#xff0c;并…

前端(二十六)——常见的HTTP异常状态码以及正反向代理配置

&#x1f475;博主&#xff1a;小猫娃来啦 &#x1f475;文章核心&#xff1a;前端常见的HTTP异常状态码以及正反向代理配置 文章目录 前端常见的HTTP异常状态码404 - 未找到资源403 - 禁止访问304 - 未修改500 - 服务器内部错误 正反向代理配置重要性本地正向代理配置服务器配…