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

用成员函数重载实现is_base_of

std::is_base_of是一个C++ 11标准中用于判断某个类是否是另一个类父类的类模板。

#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 Base,typename Derived>
//struct is_base_of {...};


int main()
{

	std::cout << std::is_base_of<A, A>::value << std::endl;
	std::cout << std::is_base_of<B, A>::value << std::endl;
	std::cout << std::is_base_of<A, B>::value << std::endl;

	return 0;
}

在这里插入图片描述
C++ 17标准中又引入了变量模板简化std::is_base_of的书写。

#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 Base,typename Derived>
//struct is_base_of {...};

template<class Base,class Derived>
inline constexpr bool is_base_of_v_v = std::is_base_of<Base, Derived>::value;

int main()
{

	std::cout << std::is_base_of<A, A>::value << std::endl;
	std::cout << std::is_base_of<B, A>::value << std::endl;
	std::cout << std::is_base_of<A, B>::value << std::endl;

	std::cout << std::endl;
	// 简化版本
	std::cout << is_base_of_v_v<A, A> << std::endl;
	std::cout << is_base_of_v_v<B, A> << std::endl;
	std::cout << is_base_of_v_v<A, B> << std::endl;

	return 0;
}

在这里插入图片描述
std::is_base_of的实现代码,写一个IsBaseOf类模板来实现,代码如下。

#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 Base,typename Derived>
//struct is_base_of {...};

template<class Base,class Derived>
inline constexpr bool is_base_of_v_v = std::is_base_of<Base, Derived>::value;

template<typename Base,typename Derived> // <父类,子类>
class IsBaseOf
{
private:
	template<typename T>
	static std::true_type test(T*);

	template<typename>
	static std::false_type test(void*);

	template<typename B,typename D>
	static auto test_middle() -> decltype(test<B>(static_cast<D*>(nullptr)));
	// 调用test()

public:
	static constexpr bool value = IsSameType < std::integral_constant<bool, std::is_class_v<Base>&& std::is_class_v<Derived>&& decltype(test_middle<Base, Derived>())::value
		, std::integral_constant<bool, true>>::value;
};


int main()
{

	std::cout << std::is_base_of<A, A>::value << std::endl;
	std::cout << std::is_base_of<B, A>::value << std::endl;
	std::cout << std::is_base_of<A, B>::value << std::endl;

	std::cout << std::endl;
	// 简化版本
	std::cout << is_base_of_v_v<A, A> << std::endl;
	std::cout << is_base_of_v_v<B, A> << std::endl;
	std::cout << is_base_of_v_v<A, B> << std::endl;

	return 0;
}

未完待续,干他菊花就对了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

低代码——“平衡饮食”才是王道

文章目录 一、低代码的概念二、低代码的优点2.1. 高效率与快速开发2.2. 降低技术门槛2.3. 适用于快速迭代与原型开发 三、低代码的缺点3.1. 定制性不足3.2. 深度不足3.3. 可能导致技术债务 四、低代码开发的未来4.1. 深度定制化4.2. 智能化 五、低代码会替代传统编程吗&#xf…

力扣每日一题day30[226. 翻转二叉树]

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#…

Abaqus基础教程--胶合失效仿真

胶合是电子行业中常见的连接方式&#xff0c;abaqus中常用cohesive单元或者cohesive接触两种方法进行胶合失效仿真&#xff0c;这两种方式操作方法有所差别&#xff0c;但结果一般大同小异。 本例模型比较简单&#xff0c;建模过程从略&#xff0c;使用静态分析&#xff0c;使…

月薪6W!美团、网易等大厂急招HarmonyOS开发!

近期&#xff0c;多家互联网公司发布了多个和鸿蒙系统有关的岗位。 不仅如此&#xff0c;还与Windows等主流老牌操作系统并列&#xff0c;并且排在首位介绍。 此外&#xff0c;今日头条招聘Android开发工程师也提及岗位需要“负责今日头条 Android、鸿蒙系统等新技术方向调研…

代码随想录算法训练营第三十七天|1049. 最后一块石头的重量 II ,494. 目标和,474.一和零

1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&am…

前端Flex布局的常用属性及其应用场景

目录 学习目标&#xff1a; 学习内容&#xff1a; 什么是flex布局&#xff1f; 如何使用flex布局&#xff1f; 容器属性 项目属性 flex布局有哪些主要的属性&#xff1f; flex布局的优缺点是什么&#xff1f; 学习时间&#xff1a; 最后总结&#xff1a; 学习目标&am…

医院信息系统源码,采用JAVA编程,支持跨平台部署应用,满足一级综合医院(专科二级及以下医院500床)的日常业务应用

医院HIS系统源码&#xff0c;HIS系统全套源码&#xff0c;支持电子病历4级&#xff0c;自主版权 his医院信息系统内设门诊/住院医生工作站、门诊/住院护士工作站。各工作站主要功能依据职能要求进行研发。如医生工作站主要功能为编辑电子病历、打印、处理医嘱&#xff1b;护士工…

虾皮关键词工具:优化您的Shopee商品曝光度和搜索排名

在Shopee平台上&#xff0c;关键词工具对于提高商品曝光度和搜索排名非常重要。本文将向您介绍一些值得推荐的关键词工具&#xff0c;这些工具可以帮助您找到合适的关键词以优化您的商品列表&#xff0c;并提高搜索排名和曝光度。 先给大家推荐一款shopee知虾数据运营工具知虾免…

读者和写者问题

它可以解决的问题&#xff1a; 可以支持多个读者访问&#xff0c;通过count计数 来实现多个读者访问的时候是互斥的&#xff0c;不会出现不符合进程同步的问题&#xff1a;设置mutex互斥锁&#xff0c;保证count或count--和if Pv(mutex)是一气呵成的 读写公平&#xff0c;通过…

软件工程之UML建模

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、建模基础 1.建模的底层逻辑 用一个公式表达建模的底层逻辑&#xff1a;建模 图形 逻辑 现实的抽象&#xff0c;用一句概括即是用图形逻辑…

一张图理解接口测试框架

测试框架先向测试数据库中插入测试数据&#xff08;如&#xff1a;name”Tom“&#xff09; 调用被测系统提供的接口&#xff08;传参&#xff1a;name”Tom“&#xff09; 从测试数据库中查到符合参数的数据 将查询到的数据组成Json格式&#xff0c;并返回给测试框架 提供…

添加新公司代码的配置步骤-Part4

原文地址&#xff1a;配置公司代码 概述 这是一系列讨论和列出向系统添加新公司代码时必须完成的事务的四篇博客中的最​​后一篇。以下是这四个文档涵盖的主题列表&#xff1a; 企业结构 - 第 1 部分 FI 配置 – 第 2 部分 SD 配置 – 第 3 部分 物流 – 概述 – 第 3 部分…

SpringBoot集成系列--ElasticJob

文章目录 一、集成步骤1、添加 ElasticJob 的依赖2、配置 ElasticJob3、定义Job 二、ElasticJob-UI三、Elastic-Job分片理解四、原理 一、集成步骤 1、添加 ElasticJob 的依赖 引入相关依赖到pom.xml <!-- Elastic-Job --> <dependency><groupId>org.apac…

随笔-这都是命吗

我与鹏哥、小付有个小群&#xff0c;前几天&#xff0c;鹏哥在群里发了一个图&#xff0c;是他那个城市准备扶持的高新产业&#xff0c;有元宇宙、量子信息、生物制药、人工智能什么的。 先前的时候鹏哥给我说过&#xff0c;当地准备了六百多亩地&#xff0c;准备发展高新产业…

模块化机房在大数据时代的角色:高效、可扩展的数据存储和处理平台

随着大数据时代的到来&#xff0c;数据已经成为企业竞争的核心资源。然而&#xff0c;传统的数据中心已经无法满足现代业务的需求&#xff0c;尤其是在数据存储和处理方面。模块化机房作为一种新型的数据中心建设模式&#xff0c;具有高效、可扩展等优势&#xff0c;逐渐成为大…

linux加速访问github的方法(2023.12.2)

本文通过修改hosts文件的方法实现加速访问github 本文查询的GitHub域名映射的ip地址时间为2023.12.2&#xff0c;建议大家先查询域名对应的IP是否有变化 查询方法 进入网址&#xff1a;IP/IPv6查询&#xff0c;服务器地址查询 - 站长工具快速查询用户的IP和浏览器、操作系统…

【Hung-Yi Lee】强化学习笔记

文章目录 What is RLPolicy GradientPolicy Gradient实际是怎么做的On-policy v.s. Off-policyExploration配音大师 Actor-Critic训练value function的方式网络设计DQN Reward ShapingNo Reward&#xff1a;Learning from Demonstration What is RL 定义一个策略网络&#xff0…

一则广告,一个故事,这就我选择学习计算机专业的两个原因

还记得当初自己为什么选择计算机&#xff1f; 现在回想起来&#xff0c;当初驱使自己选择学习计算机专业的原因&#xff0c;一共有两个&#xff1a; 一、一则长城电脑的广告。 上个世纪80年代&#xff0c;我还在读小学&#xff0c;当时在中央电视台上经常播放着的长城电脑的一则…

二十一章(网络通信)

计算机网络实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据。编写网络应用程序前&#xff0c;首先必须明确所要使用的网络协议…

05 硬件知识入门(三极管)

1 三极管简介 三极管又称晶体三极管&#xff0c;是一种具有放大功能的半导体器件。图6-1&#xff08;a&#xff09;所示是一些 常见的三极管实物外形&#xff0c;三极管的图形符号如图6-1&#xff08;b&#xff09;所示。 1. 三极管引脚的基本介绍 三极管通常有三个引脚&…