当前位置: 首页 > news >正文

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;
}

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

http://www.lryc.cn/news/258844.html

相关文章:

  • 【vue3】处理数组方法,在数组中获取指定条件所在的数组对象等持续更新笔记~~
  • digit函数
  • Linux中的堡垒机搭建以及使用
  • ubuntu安装微信客户端
  • ajax清空所有表单内容,包括input标签、单选框radio、多选框CheckBox、下拉框select以及文本域内容
  • 通配符用法
  • 如何从eureka-server上进行服务发现,负载均衡远程调用服务
  • Flutter实现Android拖动到垃圾桶删除效果-Draggable和DragTarget的详细讲解
  • Nacos和Eureka冲突问题原因分析
  • 『C++成长记』拷贝构造函数
  • B 站基于 StarRocks 构建大数据元仓
  • 最常用的4种光纤接口结构
  • Axure网页端高交互组件库, 下拉菜单文件上传穿梭框日期城市选择器
  • 基于Java新人入职管理系统
  • Python实战 | 如何抓取腾讯视频
  • 总结MySQL 的一些知识点:MySQL 导出数据
  • C语言-字符串操作函数-附加使用方式
  • 06-React组件 Redux React-Redux
  • Windows安装卸载MySQL
  • element-ui 重置resetFields()不生效
  • JVM学习笔记-如何在IDEA打印JVM的GC日志信息
  • 16ASM 汇编基础与Debug使用
  • 基于Java车辆管理系统(如高校、办公园区)
  • Dubbo v Spring Cloud:两大技术栈如何选型?
  • ubuntu上搭建bazel编译环境,构建Android APP
  • (第38天)RAC 修改 IP 信息
  • 利用法线贴图渲染逼真的3D老虎模型
  • 『 MySQL数据库 』聚合统计
  • Redis - 事务隔离机制
  • android项目实战之编辑器图片上传预览