C++新经典模板与泛型编程:用成员函数重载实现std::is_class

用成员函数重载实现is_class

std::is_class功能,是一个C++11标准中用于判断某个类型是否为一个类类型(但不是联合类型)的类模板。当时在讲解的时候并没有涉及std::is_class的实现代码,在这里实现一下。简单地书写一个IsClass类模板实现即可,代码如下。

#include "killCmake.h"#include<string>using namespace std;class A
{
};
class B : public A
{
public:B(int x) : x_(x){}
private:int x_;
};template<typename T1,typename T2>
struct IsSameType
{static const bool value = false;
};template<typename T1>
struct IsSameType<T1, T1>
{static const bool value = true;
};template<typename T>
class IsClass
{
private:template<typename U>static std::integral_constant<bool, !std::is_union<U>::value> test(int U::*);template<typename>static std::integral_constant<bool, false> test(...);public:static constexpr bool value = IsSameType<decltype(test<T>(nullptr)), std::integral_constant<bool, true>>::value;
};int main()
{std::cout << IsClass<A>::value << std::endl;std::cout << IsClass<B>::value << std::endl;std::cout << IsClass<int>::value << std::endl;return 0;
}

在这里插入图片描述

  • (1)依旧是两个同名的静态成员函数模板test(),返回的都是用std::integral_constant包装的类型。一个test()的返回类型是std::integral_constant<bool,!std::is_union<U>::value>,这表示如果U(其实也是T)的类型不是一个联合,那么返回的类型将变成std::integral_constant<bool, true>,否则返回的类型将变成std::integral_constant<bool, false>
  • (2)对于这两个test()静态成员函数,调用的时候,编译器依旧会优先选择有具体形参的test()版本,特别要注意这个形参的写法int U::*。这个写法可能刚开始看不懂,它其实是一个成员变量指针,如下面这行代码:
int A::*mp = nullptr;
  • 这行代码表示有一个名字叫作mp的指针,这个指针可以指向类A中的一个int类型的成员变量。请注意,这并不表示类A中一定要有一个int类型的成员变量,类A即便是空类都没关系。从语法上来讲,这行代码没有问题,当然,如果要给mp指针赋一个非nullptr的值,那么类A中就需要有一个int类型的成员变量了。所以,int U::*这个形参代表的就是一个成员变量指针,只不过这里简化书写把指针名去掉了(因为指针名用不到,索性就省略了)。如果U是一个类类型,那么从语法规则上来讲,int U::*这种写法就符合语法规则;否则,如果U不是一个类类型,这种写法就不符合语法规则,根据SFINAE特性,就会匹配第2个test()版本,而一旦匹配第2个test()版本,则一定
  • 总结:如果传递给IsClass的类型模板参数T是一个类类型但不是一个联合类型,那么test()返回的就是std::integral_constant<bool, true>类型,否则返回的就是std::integral_constant<bool, false>类型。会匹配成功。
  • (3)静态成员变量value的取值取决于test()的返回类型与std::integral_constant<bool,true>类型的比较。如果两个类型相同,则value的最终取值是一个布尔值true(1),否则就是false(0)。如果value最终取值为1,就表示通过模板参数传递给IsClass的是一个类类型;如果value最终取值为0,就表示通过模板参数传递给IsClass的不是一个类类型(但可能是一个联合类型)。

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

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

相关文章

1.10 C语言之外部变量与作用域

1.10 C语言之外部变量与作用域 一、外部变量概述二、练习 一、外部变量概述 我们说&#xff0c;函数&#xff08;不管是main函数还是其他函数&#xff09;内部定义的变量&#xff0c;其作用范围都只在函数内部&#xff0c;我们把这些变量叫做自动变量或者局部变量。除了局部变…

[数据集][目标检测]拉横幅识别横幅检测数据集VOC+yolo格式1962张1类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1962 标注数量(xml文件个数)&#xff1a;1962 标注数量(txt文件个数)&#xff1a;1962 标注类别数&a…

网络机房的功能有哪些?

网络机房的功能主要包括&#xff1a; 信息存储和管理&#xff1a;机房作为信息系统的核心&#xff0c;需要提供可靠的存储和管理能力&#xff0c;包括服务器、存储设备、备份系统等硬件设备&#xff0c;以及数据备份、数据迁移、容灾等管理方法和技术。网络连接和通信&#xf…

C语言指针详解上

1 野指针 int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p 200;printf("%d\n",*p);system("pause");return 0;}2 空指针 空指针的作用…

ubuntu18.04 vscode 安装 vue.volar Vue Language Features (Volar) , vue3 必备插件

直接在vscode 里面下载老是失败&#xff0c;不是网络问题&#xff0c;而是vue.volar插件配置的vscode版本与vscode版本不一致导致出现安装失败 官网下载最新的 vue.volar插件 https://marketplace.visualstudio.com/ 官网搜索 vue.volar 然后打开 Vue Language Features (Vol…

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…

数据结构 | 查漏补缺之求叶子结点,分离链接法、最小生成树、DFS、BFS

求叶子结点的个数 参考博文&#xff1a; 树中的叶子结点的个数 计算方法_求树的叶子节点个数-CSDN博客 分离链接法 参考博文 数据结构和算法——哈希查找冲突处理方法&#xff08;开放地址法-线性探测、平方探测、双散列探测、再散列&#xff0c;分离链接法&#xff09;_线性…

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …

微信机器人接口开发

简要描述&#xff1a; 设置http回调地址 请求URL&#xff1a; http://域名地址/setHttpCallbackUrl POST 请求头Headers:&#xff08;别忘了传&#xff09; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必…

家政预约小程序带商城,图文详解

家政预约小程序开发&#xff0c;在线选择服务分类&#xff0c;选择上门时间&#xff0c;提交订单&#xff0c;在线支付。 商城模块&#xff1a;商品分类&#xff0c;在线下单支付。 个人中心&#xff1a;订单管理&#xff08;家政订单&#xff0c;搬家订单&#xff0c;商品订…

hive sql子单元查找组合单元信息

1. 背景 店铺卖东西&#xff0c;会将一部分子商品&#xff08;单个商品&#xff0c;sku 粒度&#xff09;打包到一起&#xff0c;变成一个组合商品去售卖。 用户买东西&#xff0c;可能会买多个组合商品。 数仓这边拿到的数据&#xff0c;全是已经拆分到子商品的订单商品数据…

排序:直接选择排序

直接选择排序&#xff1a; 本质&#xff1a; 直接选择排序的本质就是在数组中进行遍历挑选出最大的元素&#xff0c;讲最大的元素放到对应的位置后&#xff0c;再次选出次大的位置&#xff0c;而后又放到对应的位置..........................直到数组成为一个有序序列。 优…