C++标准模板(STL)- 类型支持 (类型特性,is_union,is_class,is_function)

类型特性


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

试图特化定义于 <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_union

template< class T >
struct is_union;

(C++11 起)

检查 T 是否为联合体类型。若 T 为联合体类型,则提供等于 true 的成员常量 value 。否则 value ,等于 false 。

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

template< class T >
inline constexpr bool is_union_v = is_union<T>::value;

(C++17 起)

检查类型是否非联合类类型

std::is_class

template< class T >
struct is_class;

(C++11 起)

检查 T 是否为非联合类类型。若 T 为类类型(但非联合体),则提供等于 true 的成员常量 value 。否则, value 等于 false 。

注意以 struct 关键词声明的类型是类,故此特性对“结构体”为 true 。

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

template< class T >
inline constexpr bool is_class_v = is_class<T>::value;

 可能的实现
namespace detail {template <class T> char test(int T::*);struct two { char c[2]; };template <class T> two test(...);
}template <class T>
struct is_class : std::integral_constant<bool, sizeof(detail::test<T>(0))==1&& !std::is_union<T>::value> {};

检查是否为函数类型

std::is_function

template< class T >
struct is_function;

(C++11 起)

检查 T 是否为函数类型。如 std::function 、 lambda 、有重载 operator() 的类和指向函数指针不是函数类型。若 T 为函数类型,则提供等于 true 的成员常量 value 。否则, value 等于 false 。

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

template< class T >
inline constexpr bool is_function_v = is_function<T>::value;

(C++17 起)
 可能的实现
// 初等模板
template<class>
struct is_function : std::false_type { };// 对常规函数的特化
template<class Ret, class... Args>
struct is_function<Ret(Args...)> : std::true_type {};// 对变参数函数,如 std::printf 的特化
template<class Ret, class... Args>
struct is_function<Ret(Args......)> : std::true_type {};// 对拥有 cv 限定符的函数类型的特化
template<class Ret, class... Args>
struct is_function<Ret(Args...) const> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile> : std::true_type {};// 对拥有引用限定符的函数类型的特化
template<class Ret, class... Args>
struct is_function<Ret(Args...) &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile &&> : std::true_type {};// 对所有以上的 noexcept 版本的特化( C++17 及之后)template<class Ret, class... Args>
struct is_function<Ret(Args...) noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile && noexcept> : std::true_type {};

调用示例

#include <iostream>
#include <type_traits>struct A {};typedef union
{int a;float b;
} B;struct C
{B d;
};enum E {};enum class Ec : int {};struct D
{int fun() const&;
};template<typename>
struct PM_traits {};template<class T, class U>
struct PM_traits<U T::*>
{using member_type = U;
};int f();int main()
{std::cout << std::boolalpha;std::cout << "std::is_union<A>::value:              "<< std::is_union<A>::value << std::endl;std::cout << "std::is_union<B>::value:              "<< std::is_union<B>::value << std::endl;std::cout << "std::is_union<C>::value:              "<< std::is_union<C>::value << std::endl;std::cout << "std::is_union<int>::value:            "<< std::is_union<int>::value << std::endl;std::cout << "std::is_union<float>::value:          "<< std::is_union<float>::value << std::endl;std::cout << std::endl;std::cout << "std::is_class<A>::value:              "<< std::is_class<A>::value << std::endl;std::cout << "std::is_class<B>::value:              "<< std::is_class<B>::value << std::endl;std::cout << "std::is_class<C>::value:              "<< std::is_class<C>::value << std::endl;std::cout << "std::is_class<int>::value:            "<< std::is_class<int>::value << std::endl;std::cout << "std::is_class<float>::value:          "<< std::is_class<float>::value << std::endl;std::cout << std::endl;std::cout << "std::is_function<A>::value:           "<< std::is_function<A>::value << std::endl;std::cout << "std::is_function<int(int)>::value:    "<< std::is_function<int(int)>::value << std::endl;std::cout << "std::is_function<decltype(f)>::value: "<< std::is_function<decltype(f)>::value << std::endl;std::cout << "std::is_function<int>::value:         "<< std::is_function<int>::value << std::endl;using T = PM_traits<decltype(&D::fun)>::member_type; // T 为 int() const&std::cout << "std::is_function<T>::value:           "<< std::is_function<T>::value << std::endl;std::cout << std::endl;return 0;
}
输出

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

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

相关文章

PCL setCameraPosition 参数讲解

setCameraPosition 的原型如下void setCameraPosition (double pos_x, double pos_y, double pos_z,double view_x, double view_y, double view_z,double up_x, double up_y, double up_z, int viewport 0);pos_x pos_y pos_z为相机所在的位置view_x view_y view_z 是焦点所…

用前端框架Bootstrap的AdminLTE模板和Django实现后台首页的页面

承接博文 用前端框架Bootstrap和Django实现用户注册页面 继续开发实现 后台首页的页面。 01-下载 AdminLTE-3.1.0-rc 并解压缩 以下需要的四个文件夹及里面的文件百度网盘下载链接&#xff1a; https://pan.baidu.com/s/1QYpjOfSBJPmjmVuFZdSgFQ?pwdo9ta 下载 AdminLTE-3.1…

十种排序算法(1) - 准备测试函数和工具

1.准备工作 我们先写一堆工具&#xff0c;后续要用&#xff0c;不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…

机器人入门(四)—— 创建你的第一个虚拟小车

机器人入门&#xff08;四&#xff09;—— 创建你的第一个虚拟小车 一、小车建立过程1.1 dd_robot.urdf —— 建立身体1.2 dd_robot2.urdf —— 添加轮子1.3 dd_robot3.urdf —— 添加万向轮1.4 dd_robot4.urdf —— 添加颜色1.5 dd_robot5.urdf —— 添加碰撞检测(Collision …

在pycharm中,远程操作服务器上的jupyter notebook

一、使用场景 现在我们有两台电脑&#xff0c;一台是拥有高算力的服务器&#xff0c;另一台是普通的轻薄笔记本电脑。如何在服务器上运行jupyter notebook&#xff0c;同时映射到笔记本电脑上的pycharm客户端中进行操作呢&#xff1f; 二、软件 pycharm专业版&#xff0c;jupy…

打造美团外卖新体验,HarmonyOS SDK持续赋能开发者共赢鸿蒙生态

从今年8月起&#xff0c;所有升级到HarmonyOS 4的手机用户在美团外卖下单后&#xff0c;可通过屏幕上的一个“小窗口”&#xff0c;随时追踪到“出餐、取餐、送达”等订单状态。这个能让用户实时获悉订单进度的神奇“小窗口”&#xff0c;就是实况窗功能。 实况窗&#xff1a;简…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

843. n-皇后问题

文章目录 QuestionIdeasCode Question n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格…

心理咨询预约小程序

随着微信小程序的日益普及&#xff0c;越来越多的人开始关注如何利用小程序来提供便捷的服务。对于心理咨询行业来说&#xff0c;搭建一个心理咨询预约小程序可以大大提高服务的效率和用户体验。本文以乔拓云平台为例&#xff0c;详细介绍如何轻松搭建一个心理咨询预约小程序。…

辅助驾驶功能开发-功能规范篇(22)-6-L2级辅助驾驶方案功能规范

1.3.6 ELK 系统功能定义 ELK全称Emergency Lane Keeping,即紧急车道保持。当车辆与道路边界护栏(包含隔离带护栏、路锥、水马) 有碰撞危险或当车辆正偏出道路边沿且存在“对向来车”或“后向来车”与本车有碰撞风险时,通过给与转向反力矩进行车辆横向运动介入控制,避免或减…

态路小课堂丨如何为QSFP-DD800G光模块选择合适的光纤跳线

TARLUZ态路 在之前2篇文章中&#xff0c;我们介绍了关于800G光模块的封装、光口类型等内容。本文态路通信将为您介绍“如何为QSFP-DD800G光模块选择合适的光纤跳线”。方便您在800G数据中心网络互连场景中快速完成链路布线。 文章1&#xff1a; 三款800G光模块方案介绍—SR8/…

【AIFEM案例操作】水泵强度分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

写博客的模板

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱好者的程序人生&#xff0c;…

总感觉戴助听器耳朵又闷又堵怎么办?

随着助听器技术的进步发展&#xff0c;这些问题都有了一定程度的改善。例如&#xff0c;现在的助听器变得越来越小巧&#xff0c;外形更加美观和隐蔽&#xff1b;各种降噪技术和验配技巧也提升了助听器的音质和清晰度。 但是&#xff0c;还有一个问题困扰着很多助听器用户&…

linux的使用学习(1)

Linux 修改root密码 1.以 root 用户或具有 sudo 权限的登录到 Linux 系统。 2.打终端&#xff0c;并执行以下命令以更改 root 用户的密码&#xff1a; sudo passwd root 3.然后&#xff0c;系统会要求你输入新的 root 密码。请注意&#xff0c;在输入密码时&#xff0c;终端界…

Mac docker+vscode

mac 使用docker vs code 通过vscode 可以使用docker容器的环境。 可以在容器安装gdb, 直接调试代码。 创建容易时候可以指定目录和容易目录可以共享文件。

研发效能城市沙龙【11月12日】深圳站-《敏捷环境下的测试自动化实践指南》—陈晓鹏丨IDCF

IDCF社区研发效能城市沙龙是一个开放、共享的平台&#xff0c;我们欢迎每一位参加者积极分享自己的经验和见解&#xff0c;构建一个互联互通的技术社区。 随着这几年业务的快速变化诉求以及敏捷开发方法的流行&#xff0c;越来越多的组织都采用敏捷模式进行项目开发。而这种时…

七、W5100S/W5500+RP2040树莓派Pico<UDP 组播>

文章目录 1. 前言2. 相关简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP 组播回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP组播是一种基于UDP协议的通信方式&#xff0c;它允许一台计算机通过发送单…

【咕咕送书 | 第5期】国家数据局正式揭牌,数据专业融合型人才迎来发展良机

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 ⛳️ 写在前面参与规则引入《数据要素安全流通》《Python数据挖掘&#xff1a;入门、进阶与实用案例分析》《数据保…

身份证OCR:变革的触手,掀起识别的革命

身份证OCR识别技术&#xff08;Optical Character Recognition&#xff09;是一项将身份证上的文字信息转化为可编辑、搜索、存储、分享的电子文本的技术。它的发展与信息技术和身份认证需求的不断演进密切相关。以下将简要介绍身份证OCR识别技术的历史以及兴起背景。 OCR识别…