首页 > 其他分享 >【模板进阶】std::is_union、std::is_class、std::integral_constant

【模板进阶】std::is_union、std::is_class、std::integral_constant

时间:2024-11-15 22:20:33浏览次数:3  
标签:std constant 进阶 union integral value type

一、std::is_union

s t d : : i s _ u n i o n std::is\_union std::is_union是 C + + 11 C++11 C++11引入的类模板,用于判断一个类是否是一个联合 u n i o n union union类型。

这个类模板中有一个 v a l u e value value成员,如果类型 T T T是 u n i o n union union类型,那么这个 v a l u e value value的值为 1 1 1,否则为 0 0 0。

由于这个模板的实现与编译器内部的支持有关,因此更详细的源码需要查阅相应的资料。


这里展示一下基本的使用方法:

首先定义一个结构体和联合体:

struct A {};

union B {
	int num;
	char type;
};

调用测试函数,打印相应的类名和 v a l u e value value的值:

void Test1() {
	std::cout << typeid(std::is_union<A>::type).name() << std::endl;
	std::cout << typeid(std::is_union<B>::type).name() << std::endl;
	std::cout << typeid(std::is_union<A>::value_type).name()<< std::endl;
	
	std::cout << std::is_union<A>::value << std::endl;
	std::cout << std::is_union<B>::value << std::endl;

	//变量模板
	std::cout << std::is_union_v<A> << std::endl;
}

其中, C + + 17 C++17 C++17之后,有相应的变量模板 i s _ u n i o n _ v is\_union\_v is_union_v可供使用,直接调用其内部的 v a l u e value value值:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以发现,其类型就是 s t d : : i n t e g r a l _ c o n s t a n t std::integral\_constant std::integral_constant,是一个类模板,可以看作是整型常量的包装。

二、std::is_class

s t d : : i s _ c l a s s std::is\_class std::is_class是 C + + 11 C++11 C++11引入的一个类模板,用于判断一个类是否是类类型,使用方法和 i s _ u n i o n is\_union is_union类似。

在 C + + 17 C++17 C++17之后同样有相应的变量模板:

调用测试函数:

void Test2() {
	std::cout << typeid(std::is_class<A>::type).name() << std::endl;
	std::cout << typeid(std::is_class<B>::type).name() << std::endl;
	std::cout << typeid(std::is_class<A>::value_type).name() << std::endl;

	std::cout << std::is_class<A>::value << std::endl;
	std::cout << std::is_class<B>::value << std::endl;

	//变量模板
	std::cout << std::is_class_v<A> << std::endl;
}


其类型同样是 s t d : : i n t e g r a l _ c o n s t a n t std::integral\_constant std::integral_constant:

在这里插入图片描述


三、std::integral_constant

s t d : : i n t e g r a l _ c o n s t a n t std::integral\_constant std::integral_constant是 C + + 11 C++11 C++11引入的类模板,主要用于包装一个整数或者布尔类型,其源码大致如下:

//std::intgral_constant源码实现

template<typename T,T _Val>
struct integral_constant {
	static constexpr T value = _Val;
	using value_type = T;
	using type = integral_constant;

	constexpr operator value_type() const noexcept { return value; }  //运行类型转换为T类型
	constexpr value_type operator()() const noexcept { return value; } //重载括号运算符
};

重点部分就是静态成员变量 v a l u e value value,以及定义其类型的别名 t y p e type type和值的类型 v a l u e _ t y p e value\_type value_type。


下面是简单的一种使用:

void Test4() {
	std::cout << integral_constant<int, 100>::value << std::endl;
	std::cout << typeid(integral_constant<int, 100>::value_type).name() << std::endl;
	std::cout << typeid(integral_constant<bool, true>::type).name() << std::endl;
}

可以提取出它的类和相应包装的值的大小:

在这里插入图片描述


同样,我们也可以将类似 ! s t d : : i s _ u n i o n < T > : : v a l u e !std::is\_union<T>::value !std::is_union<T>::value的值包装成类,如下:

void Test5() {
	//把!is_union<A>::value包装成类
	std::integral_constant<bool, !std::is_union<A>::value>myobj; 
	
	std::cout << typeid(myobj).name() << std::endl;
	std::cout << typeid(myobj.value).name() << std::endl;
	std::cout << myobj.value << std::endl;
}

运行结果如下:

在这里插入图片描述

这样做的意义在于,有的时候我们需要一个类型,而不是一个值,如函数返回的类型中,我们可以通过包装将值变成类作为返回的类型。

标签:std,constant,进阶,union,integral,value,type
From: https://blog.csdn.net/Antonio915/article/details/143808653

相关文章

  • Android15音频进阶之input调节CarAudioService音量过程(九十四)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......
  • Flutter进阶(4):定时器使用(Timer)
    一、Timer简介Flutter的Timer类是Dart语言中的一个内置类,用于创建定时器。定时器可以用于在一段时间后执行代码,或者以固定的时间间隔重复执行代码。Timer类提供了一种简单的方式来管理这些时间相关的任务。二、Timer类的详细介绍2.1导入dart:async包要使用Timer类,首......
  • C语言进阶3:字符串+内存函数
    本章重点求字符串长度strlen长度不受限制的字符串函数strcpystrcatstrcmp长度受限制的字符串函数strncpystrncatstrncmp字符串查找strstrstrtok误信息报告strerror字符操作内存操作memcpymemmovememcmpmemset0.前言:C语言中对字符和字符串的处理很是......
  • 指针(进阶)
    重点讲述:1.字符指针2.数组指针3.指针数组4.数组传参和指针传参5.函数指针6.函数指针数组7.指向函数指针数组的指针8.回调函数1.字符指针在指针的类型中我们知道有一种指针类型为字符指针char*一般使用:还有一种使用方式如下:代码constchar*pstr="zhuying.";有......
  • Python小白学习教程从入门到入坑------第三十二课 生成器(语法进阶)
    目录一、生成器generator1.1生成器表达式1.1.1表达式一1.1.2表达式二二、可迭代对象、迭代器、生成器三者之间的关系2.1定义与特性2.2关系与区别一、生成器generator在Python中,生成器(Generators)是一种用于迭代对象的特殊类型函数。它们允许你生成一个序列......
  • Python小白学习教程从入门到入坑------第三十一课 迭代器(语法进阶)
    目录一、可迭代对象Iterable1.1可迭代对象的条件1.2for循环工作原理1.3isinstance()二、迭代器 Iterator2.1 __iter__() 和 __next__()2.2 可迭代对象&迭代器2.2.1定义与特性2.2.2 关系与转换2.2.3应用场景三、迭代器协议(了解即可)四、自定义迭代器类......
  • Git进阶实用命令
    总结最常用的git命令操作。Mac推荐可视化软件Sourcetree1.本地仓库gitinit#初始化本地git以下所有操作的前提条件gitadd-A#添加当前所有变动文件到本地缓存区gitcommit-m'<commit-word>'#提交缓存区内容到本地仓库gitcommit-am'<commit-word>'#上......
  • 分布式管理进阶:HarmonyOS Next 中的设备信息查询与状态监听
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在探索HarmonyOSNext的分布式管理服务时......
  • Chrome DevTools Protocol 进阶: Page域
    前言本章开始我们将进一步学习ChromeDevToolsProtocol(CDP),首先切入的内容是CDP中的域。在ChromeDevToolsProtocol(CDP)中,Page域是一个至关重要的部分,它负责控制浏览器页面的导航、加载、渲染以及其他与页面相关的操作。通过Page域,你可以执行页面跳转、截图、处理弹......
  • ArkUI进阶-1
    文章目录ArkUI(方舟UI框架)1.简介2.基本概念3.概述4.布局1.概述2.通用布局属性1.盒子属性2.背景属性3.定位属性4.通用属性3.线性布局(Row,Column)4.弹性布局(Flex)5.层叠布局(Stack)6.轮播(Swiper)......