C++标准模板(STL)- 类型支持 (类型属性,is_literal_type,is_polymorphic,is_empty)

news2024/11/26 4:27:20

类型特性

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

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

template< class T >
struct is_literal_type;

(C++11 起)
(C++17 中弃用)
(C++20 中移除)

T 满足所有字面类型 (LiteralType) 的要求,则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

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

template< class T >
inline constexpr bool is_literal_type_v = is_literal_type<T>::value;

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

唯有字面类型能作为 constexpr 函数的参数或返回类型。只有字面类能拥有 constexpr 成员函数。

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

struct A
{
    int m;
};

struct B
{
    virtual ~B();
};

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

    return 0;
}
输出

检查类型是否为类(但非联合体)类型且无非静态数据成员

std::is_empty

template< class T >
struct is_empty;

(C++11 起)

T 是空类类型(即无异于 0 大小位域的非静态数据成员、无虚函数、无虚基类,且无非空基类的非联合类类型),则提供等于 true 的成员常量 value 。对于任何其他类型, value 为 false 。

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

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

template< class T >
inline constexpr bool is_empty_v = is_empty<T>::value;

(C++17 起)
注意

因为空基类优化,从空类类型继承通常不增加类的大小。

std::is_empty<T> 及所有其他类型特性均为空类。

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

struct A {};

struct B
{
    int m;
};

struct C
{
    virtual ~C();
};

union D {};

struct E
{
    [[no_unique_address]] D d;
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::is_empty<int>::value:            "
              << std::is_empty<int>::value << std::endl;
    std::cout << "std::is_empty<double>::value:         "
              << std::is_empty<double>::value << std::endl;
    std::cout << "std::is_empty<std::string>::value:    "
              << std::is_empty<std::string>::value << std::endl;
    std::cout << "std::is_empty<A>::value:              "
              << std::is_empty<A>::value << std::endl;
    std::cout << "std::is_empty<B>::value:              "
              << std::is_empty<B>::value << std::endl;
    std::cout << "std::is_empty<C>::value:              "
              << std::is_empty<C>::value << std::endl;
    std::cout << "std::is_empty<D>::value:              "
              << std::is_empty<D>::value << std::endl;
    std::cout << "std::is_empty<E>::value:              "
              << std::is_empty<E>::value << std::endl; // 结果依赖于 ABI

    return 0;
}
 输出

检查类型是否为多态类类型

std::is_polymorphic

template< class T >
struct is_polymorphic;

(C++11 起)

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

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

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

template< class T >
inline constexpr bool is_polymorphic_v = is_polymorphic<T>::value;

(C++17 起)

可能的实现
namespace detail {
 
template <class T>
std::true_type detect_is_polymorphic(
decltype(dynamic_cast<const volatile void*>(static_cast<T*>(nullptr)))
);
template <class T>
std::false_type detect_is_polymorphic(...);
} // namespace detail
 
template <class T>
struct is_polymorphic : 
decltype(detail::detect_is_polymorphic<T>(nullptr)) {};
调用示例
#include <iostream>
#include <type_traits>

struct A
{
    int m;
};

struct B
{
    virtual void foo();
};

struct C : B {};

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

    return 0;
}
输出

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

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

相关文章

uniapp小程序刮刮乐抽奖

使用canvas画布画出刮刮乐要被刮的图片&#xff0c;使用移动清除画布。 当前代码封装为刮刮乐的组件&#xff1b; vue代码&#xff1a; <template><view class"page" v-if"merchantInfo.cdn_static"><image class"bg" :src&q…

强化学习的动态规划二

一、典型示例 考虑如下所示的44网格。 图1 非终端状态为S {1, 2, . . . , 14}。在每个状态下有四种可能的行为&#xff0c;A {up, down, right, left}&#xff0c;这些行为除了会将代理从网格上移走外&#xff0c;其他都会确定性地引起相应的状态转换。因此&#xff0c;例如&…

VMware产品收集日志方法汇总

概述 vCenter日志是一个用于存储与vSphere环境相关的各种活动、事件和警告的日志系统。通过收集并分析vCenter日志&#xff0c;管理员可以获得有关其虚拟化环境的重要洞察和故障排除信息。 vCenter日志由多个组件组成&#xff0c;包括vCenter Server、ESXi主机和其他vSphere组…

软件测试面试题:Web 端测试和 App 端测试有何不同

Web 端测试和 App 端测试是针对不同平台的上的应用进行测试&#xff0c;Web应用和App端的应用实现方式不同&#xff0c;测试时的侧重点也不一样。 今天这篇文章就来介绍下两者的不同之处以及测试时的侧重点。 Web 端应用和 App 端应用的区别 平台兼容性 Web 端应用可以在任何…

C#开源的一个能利用Windows通知栏背单词的软件 - ToastFish

前言 今天给大家推荐一个C#开源且免费的能利用Windows通知栏背单词的软件&#xff0c;可以让你在上班、上课等恶劣环境下安全隐蔽地背单词&#xff08;利用摸鱼时间背单词的软件&#xff09;&#xff1a;ToastFish。 操作系统要求 目前该软件只支持Windows10及以上系统&…

【C语言】C语言⻘蛙跳台阶问题--递归问题

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 本期专栏&#x1f525;&#xff1a;本期将分享一些猜数字小游戏怎么一步一步实现的 &#x1f308;作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心…

Fourier分析导论——第3章——Fourier级数的收敛性(E.M. Stein R. Shakarchi)

第 3 章 Fourier级数的收敛性(Convergence of Fourier Series) The sine and cosine series, by which one can represent an arbitrary function in a given interval, enjoy among other remarkable properties that of being convergent. This property did not escape…

nodejs+vue网上商城系统系统-毕业设计

网上商城系统的架构设计通常分为三层&#xff1a;客户端层、应用层和数据层。 客户端层&#xff1a;客户端层是用户与系统交互的界面&#xff0c;包括Web页面、移动App等。用户可以通过客户端层进行商品浏览、下单、支付等操作。应用层&#xff1a;应用层是业务逻辑处理的中心&…

一个 不用氪金 也能让你变强的 VSCode 插件 Ai

哈喽,大家好 我是 彩色之外&#x1f468;&#x1f3fb;‍&#x1f4bb;。今天给大家推荐一款不用充钱也能让你变强的 vscode 插件 通义灵码&#xff08;TONGYI Lingma&#xff09;&#xff0c;可以称之为 Copilot 的替代甜品 &#x1f4aa; &#x1f440; 前期回顾 NPM- 滚动进…

BIOS开发笔记 – 显示

UEFI启动流程跑完前三阶段,UEFI环境的准备基本完成,到BDS阶段的任务就是准备引导OS。在此之前还需要使一些必要的硬件工作起来,比如键盘设备,屏幕等,怎么让屏幕工作呢?简单的说就是执行其相关的UEFI驱动。要注意一下的是,这里所说的驱动并不是屏幕的驱动,而是GPU的驱动…

Proteus仿真--1602LCD随机模拟显示乘法口诀(仿真文件+程序)

本文主要介绍基于51单片机的1602LCD随机模拟显示乘法口诀实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中上方主要是1602LCD液晶显示&#xff0c;使用方法点击左下方的按键开关实现不同的乘数切换&#xff0c;按照乘法表进行 仿真运行视频 Prot…

Android Studio的Java项目种运行main()的方法

首先随便在项目里面建一个类 public class TestSocket {public static void main(String[] args) {System.out.println("hahah");}}直接运行时会直接报错的 在项目的 .idea 添加代码 <option name"delegatedBuild" value"false"/> 再…

Centos7安装Elasticsearch和Kibana 记录(无坑版)

说明&#xff1a; 本文命令全部标红 elasticsearch使用版本是7.17.5 ik分词器也是7.17.5 虚拟机配置&#xff1a;2核4g centos版本&#xff1a;7 1、获取elasticsearch的安装包 下载&#xff1a;wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17…

《网络协议》01. 基本概念

title: 《网络协议》01. 基本概念 date: 2022-08-30 09:50:52 updated: 2023-11-04 07:28:52 categories: 学习记录&#xff1a;网络协议 excerpt: 互联网、网络互连模型&#xff08;OSI&#xff0c;TCP/IP&#xff09;、计算机通信基础。 comments: false tags: top_image: /i…

k-means算法c++实现

计算数据集中的元素与各个簇的中心的距离&#xff0c;将它赋给最近的簇&#xff0c;然后重新计算每个簇的平均值&#xff0c;再将元素按离平均值点最近的原则重新分配直到没有出现重新分配 该算法要事先给出k的值&#xff0c;即划分为几个簇。 vector<int> datoclu(dat…

JDBC数据库连接---附通用的CRUD类

文章目录 JDBC数据库连接1 导包2 编写配置文件3 编写连接数据库代码4 测试工具类5 附加1 通用的CRUD类2 测试CURD类3 测试 JDBC数据库连接 本篇文章以 MySQL 数据库为例&#xff0c;若要切换其他数据库&#xff0c;只需修改 resource文件夹中的 jdbc.properties 配置文件即可。…

《实战:如何搭建一个完整的 Vue2.0 项目》- 7、Vue2.x 项目 webpack 4 升级 5(半自动升级)

1.自动升级 先全局安装升级插件 npm i npm-check npm-check-updates -g检查依赖 npm-check更新检查后的依赖并展示版本号&#xff0c;此时 package.json还没有更新 npm-check-updates升级 package.json&#xff0c;下图显示更新版本&#xff0c;此时 package.json文件已变更…

客服管理者如何调动客服人员的积极性?

客户是企业的财富&#xff0c;良好的客户服务体验可以有效地促进企业的销售和声誉&#xff0c;因此&#xff0c;客服工作显得尤为重要。而客服人员的积极性直接影响了整个客服部门的质量和效率。如何调动客服人员的积极性&#xff0c;成为了每个客服管理者都需要面对的难题。本…

Mendix 创客访谈录|质量部门开发应用程序自主可控

本期创客 我们是来自于西门子成都工厂质量部的 Mendix “草台班子” 创客访谈 在使用Mendix低代码平台开发应用软件前&#xff0c;你和你的部门/团队主要应用什么开发工具&#xff1f; 我们质量部属于OT&#xff08;运营技术&#xff09;部门, 一般是使用一些IT团队提供的功能单…