当前位置: 首页 > news >正文

C++标准模板(STL)- 类型支持 (类型属性,is_volatile,is_trivial,is_const)

类型特性


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

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

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

类型属性


定义于头文件 <type_traits>

继承自 std::integral_constant

成员常量

value

[静态]

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

operator bool

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

operator()

(C++14)

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

若 T 为引用类型则 is_const<T>::value 始终为 false 。检查可能为引用的类型的常性的正确方式是移除引用: is_const<typename remove_reference<T>::type> 。

 可能的实现
template<class T> struct is_const          : std::false_type {};
template<class T> struct is_const<const T> : std::true_type {};

检查类型是否为 const 限定

std::is_const

template< class T >
struct is_const;

(C++11 起)

T 为 const 限定类型(即 const 或 const volatile ),则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

template< class T >
inline constexpr bool is_const_v = is_const<T>::value;

(C++17 起)
 调用示例
#include <iostream>
#include <type_traits>int main()
{std::cout << std::boolalpha;std::cout << "std::is_const<int>::value:            "<< std::is_const<int>::value << std::endl; // falsestd::cout << "std::is_const<const int>::value:      "<< std::is_const<const int>::value << std::endl; // truestd::cout << "std::is_const<const int*>::value:     "<< std::is_const<const int*>::value << std::endl; // falsestd::cout << "std::is_const<int* const>::value:     "<< std::is_const<int* const>::value << std::endl; // truestd::cout << "std::is_const<const int&>::value:     "<< std::is_const<const int&>::value << std::endl; // falsestd::cout << "std::is_const<typename std::remove_reference<const int&>::type>::value:   "<< std::is_const<typename std::remove_reference<const int&>::type>::value << std::endl; // truereturn 0;
}
输出

检查类型是否为 volatile 限定

std::is_volatile

template< class T >
struct is_volatile;

(C++11 起)

T 为 volatile 限定类型(即 volatile 或 const volatile ),则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

template< class T >
inline constexpr bool is_volatile_v = is_volatile<T>::value;

(C++17 起)
 可能的实现
template<class T> struct is_volatile             : std::false_type {};
template<class T> struct is_volatile<volatile T> : std::true_type {};
调用示例
#include <iostream>
#include <type_traits>int main()
{std::cout << std::boolalpha;std::cout << "std::is_volatile<int>::value:         "<< std::is_volatile<int>::value << std::endl;std::cout << "std::is_volatile<volatile int>::value:"<< std::is_volatile<volatile int>::value << std::endl;return 0;
}
输出 

检查类型是否平凡

std::is_trivial

template< class T >
struct is_trivial;

(C++11 起)

T平凡类型 (TrivialType) (即标量类型、有平凡默认构造函数的可平凡复制类,或这些类/类型的数组,可有 cv 限定),则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

若 std::remove_all_extents_t<T> 是(可有 cv 限定的) void 以外的不完整类型,则行为未定义。

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

template< class T >
inline constexpr bool is_trivial_v = is_trivial<T>::value;

(C++17 起)
可能的实现
template< class T >
struct is_trivial : std::integral_constant< bool,std::is_trivially_copyable<T>::value &&std::is_trivially_default_constructible<T>::value > {};
调用示例
#include <iostream>
#include <type_traits>struct A
{int m;
};struct B
{B() {}
};int main()
{std::cout << std::boolalpha;std::cout << "std::is_trivial<A>::value:    "<< std::is_trivial<A>::value << std::endl;std::cout << "std::is_trivial<B>::value:    "<< std::is_trivial<B>::value << std::endl;return 0;
}
输出

相关文章:

  • 【跟小嘉学 Rust 编程】三十四、Rust的Web开发框架之一: Actix-Web的进阶
  • C#反射的学习,反射的一些注意事项,反射的一些使用代码的实例
  • VSCode 如何设置背景图片
  • Linux启动故障排错
  • 使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令
  • LiveMeida视频接入网关
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • 基于tpshop开发多商户源码支持手机端+商家+门店 +分销+淘宝数据导入+APP+可视化编辑
  • Centos7下生成https自签名证书
  • 【Linux】安装使用Nginx负载均衡,并且部署前端项目
  • 常用编程语言排行与应用场景汇总(2023.10)
  • NOIP2023模拟8联测29 C. 蛋糕
  • 【Django】项目模型
  • 第四章 应用SysML基本特性集的汽车示例 P2(断更)|系统建模语言SysML实用指南学习
  • MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)(八)
  • python3.6+scrapy+mysql 爬虫实战
  • #Java异常处理
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 《剑指offer》分解让复杂问题更简单
  • ES6系列(二)变量的解构赋值
  • fetch 从初识到应用
  • Java知识点总结(JavaIO-打印流)
  • oldjun 检测网站的经验
  • Python学习之路16-使用API
  • React16时代,该用什么姿势写 React ?
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vagrant 添加本地 box 安装 laravel homestead
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 记一次和乔布斯合作最难忘的经历
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 我的面试准备过程--容器(更新中)
  • 新手搭建网站的主要流程
  • 一个JAVA程序员成长之路分享
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​【已解决】npm install​卡主不动的情况
  • # include “ “ 和 # include < >两者的区别
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (10)ATF MMU转换表
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)jdk与jre的区别
  • (转)菜鸟学数据库(三)——存储过程
  • (转)用.Net的File控件上传文件的解决方案
  • .htaccess 强制https 单独排除某个目录
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @JSONField或@JsonProperty注解使用
  • @Transactional 详解
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具