C++标准模板(STL)- 类型支持 (类型属性,is_pod,is_trivially_copyable,is_standard_layout)

news2024/11/30 8:38:26

类型特性

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

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

template< class T >
struct is_trivially_copyable;

(C++11 起)

T可平凡复制 (TriviallyCopyable) 类型,则提供等于 true 的成员常量 value 。对于任何其他类型, value 是 false 。

仅有的可平凡复制类型是标量类型、可平凡复制类及这些类型/类的数组(可以为 cv 限定)。

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

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

template< class T >
inline constexpr bool is_trivially_copyable_v = is_trivially_copyable<T>::value;

(C++17 起)
注意

可平凡复制的对象是仅有的能以 std::memcpy 安全复制或以 std::ofstream::write()/std::ifstream::read() 序列化自/到二进制文件的对象。

一般来说,对于任何可平凡复制类型 TT 对象 obj1 ,能复制 obj1 的底层字节(例如用 std::memcpy 或 std::memmove )到 charunsigned char 或 std::byte 的数组中,或到 T 的另一不同对象 obj2 中。 obj1obj2 均不可为潜在重叠的子对象。

若复制 obj1 的底层字节到这种数组中,然后复制结果内容回 obj1 中,则 obj1 将保有其原值。若复制 obj1 的底层字节到 obj2 中,则 obj2 将保有 obj1 的值。

调用示例
#include <iostream>
#include <type_traits>

struct A
{
    int m;
};

struct B
{
    B(const B&) {}
};

struct C
{
    virtual void foo();
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_trivially_copyable<A>::value:     "
              << std::is_trivially_copyable<A>::value << std::endl;
    std::cout << "std::is_trivially_copyable<B>::value:     "
              << std::is_trivially_copyable<B>::value << std::endl;
    std::cout << "std::is_trivially_copyable<C>::value:     "
              << std::is_trivially_copyable<C>::value << std::endl;

    return 0;
}
输出

 

检查是否是一个标准布局类型

std::is_standard_layout

template< class T >
struct is_standard_layout;

(C++11 起)

T 为标准布局类型(即标量类型、标准布局类、或这种类型/类的数组,可以有 cv 限定),则提供等于 true 的成员常量 value 。对任何其他类型, value 为 false 。

标准布局类是满足 标准布局类型 (StandardLayoutType) 的类。

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

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

template< class T >
inline constexpr bool is_standard_layout_v = is_standard_layout<T>::value;

(C++17 起)
注意

指向标准布局类的指针能转换(以 reinterpret_cast )成指向其首个非静态数据成员的指针,反之亦然。

若标准布局联合体保有二个或多个标准布局结构体,则允许查看它们的公共前导部分。

宏 offsetof 只能用于标准布局类。

调用示例
#include <iostream>
#include <type_traits>

struct A
{
    int m;
};

struct B
{
    int m1;
private:
    int m2;
};

struct C
{
    virtual void foo();
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_standard_layout<A>::value:    "
              << std::is_standard_layout<A>::value << std::endl;
    std::cout << "std::is_standard_layout<B>::value:    "
              << std::is_standard_layout<B>::value << std::endl;
    std::cout << "std::is_standard_layout<C>::value:    "
              << std::is_standard_layout<C>::value << std::endl;

    return 0;
}
输出

检查类型是否为简旧数据(POD)类型

std::is_pod

template< class T >
struct is_pod;

(C++11 起)
(C++20 中弃用)

T简旧数据类型 (PODType) (“简旧数据类型”),即既是平凡又是标准布局,则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

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

template< class T >
inline constexpr bool is_pod_v = is_pod<T>::value;

(C++17 起)
(C++20 中弃用
注意

POD 类型对象与 C 编程语言完全兼容。

调用示例
#include <iostream>
#include <type_traits>

struct A
{
    int m;
};

struct B
{
    int m1;
private:
    int m2;
};

struct C
{
    virtual void foo();
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_pod<A>::value:    "
              << std::is_pod<A>::value << std::endl;
    std::cout << "std::is_pod<B>::value:    "
              << std::is_pod<B>::value << std::endl;
    std::cout << "std::is_pod<C>::value:    "
              << std::is_pod<C>::value << std::endl;

    return 0;
}
输出

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

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

相关文章

Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库

背景介绍 Apache Doris是一个基于MPP架构的易于使用&#xff0c;高性能和实时的分析数据库&#xff0c;以其极高的速度和易用性而闻名。海量数据下返回查询结果仅需亚秒级响应时间&#xff0c;不仅可以支持高并发点查询场景&#xff0c;还可以支持高通量复杂分析场景。 这些都…

如何使用Scrapy提取和处理数据

目录 一、安装和设置Scrapy 二、创建爬虫 三、提取数据 四、处理数据 五、存储数据 六、进阶操作 七、注意事项 总结 Scrapy是一个强大且灵活的Python库&#xff0c;用于创建网页爬虫&#xff0c;提取和处理数据。本文将为您深入讲解如何使用Scrapy进行数据处理&#x…

AI正在改变人类社会 - 内容行业的衰落

现在的 AI 技术&#xff0c;每天都在进化。我有一种感觉&#xff0c;普通人大概没意识到&#xff0c;它马上就要改变人类社会了。 历史上&#xff0c;这种事一再发生。在你不知不觉中&#xff0c;某些大事件悄悄酝酿&#xff0c;突然就冲击到了你的生活&#xff0c;将你的人生…

TensorRT加速的原因:量化+网络结构优化

文章目录 1. TensorRT 简介2. TensorRT 加速的原理量化网络结构优化 3. TensorRT 的 工作流程TensorRT引擎的构建&#xff1a;BuildTensorRT引擎的推理&#xff1a;Infer 1. TensorRT 简介 TensorRT可以帮助你把训练好的AI模型&#xff0c;部署到边端Nvidia的设备&#xff0c;…

结合组件库实现table组件树状数据的增删改

如图所示&#xff0c;可以实现树状数据的新增子项&#xff0c;新增平级&#xff0c;删除。主要用到了递归 代码&#xff1a; <template><el-table :data"tableData" style"width: 100%; margin-bottom: 20px" row-key"id" border def…

大促期间如何监测竞品数据

无论在什么时候&#xff0c;竞品的数据都是品牌非常关注的&#xff0c;大促当然也不例外&#xff0c;所以准确监测到竞品数据应该如何分析也很关键&#xff0c;通过分析竞品&#xff0c;品牌可以获取非常多有价值的内容&#xff0c;如竞品王牌产品的分析、行业分析报告等。 力维…

JAVA毕业设计108—基于Java+Springboot的OA办公自动化人事管理系统(源码+数据库)

基于JavaSpringboot的OA办公自动化人事管理系统(源码数据库)108 一、系统介绍 本系统分为员工、部门经理、人事、管理员四种角色(角色菜单可以自行分配) 用户&#xff1a; 登录、考勤管理、申请管理、任务管理、日程管理、工作计划管理、文件管理、笔记管理、邮件管理、通讯…

如何在 Photoshop 中制作水晶效果

如何在 Photoshop 中仅使用一些智能滤镜快速轻松地制作水晶效果 1.如何在 Photoshop 中创建快速背景 步骤1 首先&#xff0c;让我们从一个新的画布开始&#xff0c;使用颜色填充图层填充柔和的紫罗兰色。通过选择图层并右键单击 > 转换为智能对象&#xff0c;将该颜色填充…

什么是Node.js的流(stream)?它们有什么作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

设计模式第一课-单例模式(懒汉模式和饿汉模式)

单例模式 个人理解&#xff1a;单例模式实际就是通过类加载的方式获取到一个对象&#xff0c;并且保证这个对象在使用中只有一个&#xff0c;不允许再次被创建 一、懒汉模式 1、懒汉模式的基础写法 代码解释&#xff1a; &#xff08;1&#xff09;、编写LazySingleton类的…

图解系列--路由器和它庞大的功能

03.01 何为路由器 路由器是指主要负责 OSI参考模型中网络层的处理工作&#xff0c;并根据路由表信息在不同的网络 之间转发IP 分组的网络硬件(图3-1)。这里的网络一般是指IP 子网&#xff0c;也可以称为广播域。此外&#xff0c;现在的路由器还会搭载其他各种各样的功能。 0…

3D人像手办定制业务再掀热潮,这一次有怎样的革新?(方法篇)

最近&#xff0c;3D真人手办热潮再起&#xff0c;最出圈的一次当属亚运会的3D打印元宇宙体验舱里面各国运动员带火的真人手办定制项目。作为3D技术推广者&#xff0c;博雅仔也在后台接受了很多朋友的询问—— ◆ 技术已经成熟了吗&#xff1f; ◆ 个人定做3D真人手办市场价格…

[机缘参悟-116] :世间的四张大网以及新型的第五张网,以及在网中流动的内容

目录 一、第一张网&#xff1a;人际网&#xff08;人&#xff09;》流动是人的知情意行 1.1 什么是人际网 1.2 人际网中流动是人的知情意行 1.2.1 在人际网中&#xff0c;流动的是人与人之间的各种信息、情感和资源。 1.2.2 在人际网中流动的是人的知情意行 1.2.3 在人际…

基于JAVA+SpringBoot+Vue的前后端分离的大学生创新作品审核平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着大学教育的发展&a…

实战演练——拦截史迪仔广播

目录 目录 1.MainActivity 2.MainActivity2 3.MyHelper 4.OutCallReceiver 5.activity_main.xml 6.activity_main2.xml 7.item.xml 8.themes.xml 9.项目代码布局情况 10.运行情况展示 11.该项目常见报错以及解决方法 完成一个拦截拨号的app&#xff0c;包含以下功…

Rust 语言和 select 库的编写程序

使用 Rust 语言和 select 库的下载器程序&#xff0c;用于下载 视频。 首先&#xff0c;我们需要导入 select 库。select 库是一个用于处理多个输入/输出流的 Rust 库。它提供了一个函数&#xff0c;可以让我们等待多个文件描述符&#xff08;如网络套接字&#xff09;可读或可…

【Python 零基础入门】Numpy 常用函数 通用函数 保存加载

【Python 零基础入门】内容补充 4 Numpy 常用函数 通用函数 & 保存加载 概述通用函数np.sqrt 平方根np.log 对数np.exp 指数np.sin 正弦 点积和叉积np.dot 点积叉积 矩阵乘法np.matmul 保存 & 加载np.save 保存单个数组np.savez 保存多个数组np.savez_compressed 保存n…

Halcon计算点到直线的垂线方程

一、我们都知道&#xff0c;点到直线最短距离就是垂线。Halcon也有现成的算子可以计算点到直线的距离 distance_pl( : : Row, Column, Row1, Column1, Row2, Column2 : Distance)。但是此算子不会返回具体的垂点坐标。当我们希望显示垂线的时候是需要知道垂点坐标&#xff0c;才…

目前比较好用的护眼台灯?最好用的五款护眼台灯推荐

灯具可以说是我们日常生活中使用很频繁的工具了&#xff0c;我们每天都离不开它给我们带来的光亮。当然&#xff0c;现在灯具也有很多种类可以挑选&#xff0c;今天主要带来五款非常好用的护眼台灯指南。 1.书客护眼台灯Pro 使用体验分数&#xff1a;10分 亮点&#xff1a;具…

我的1024创作纪念日

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 机缘 起初我并没有写博客这个习惯&#xff…