C++模板判断类中是否存在某个名称的成员函数

由一道C++面试题引发的思考 - 知乎


//判断是否存在指定的成员函数名
template <typename T, typename = void>
struct HasMemF_Fun : public std::false_type {};template <typename T>
struct HasMemF_Fun<T, std::void_t<decltype(&T::Fun123)>>: std::is_member_function_pointer<decltype(&T::Fun123)> {};//判断是否存在指定的成员变量名
template <typename T, typename = void>
struct HasMemV_Name : public std::false_type {};template <typename T>
struct HasMemV_Name<T, std::void_t<decltype(&T::name123)>>: std::is_member_object_pointer<decltype(&T::name123)> {};struct XXX
{void Fun123() {}std::wstring name123;
};int main()
{if (HasMemV_Name<XXX>::value){std::cout << "XXX::name123 exists" << std::endl;}if (HasMemF_Fun<XXX>::value){std::cout << "XXX::Fun123 exists" << std::endl;}
}运行结果:
XXX::name123 exists
XXX::Fun123 exists


#define DEFINE_MEMBERFUNCTION_TRAIT(name, func)                     \template <typename T, typename = void>                           \struct name : public std::false_type {};                         \\template <typename T>                                            \struct name<T, std::void_t<decltype(&T::func)>>                  \: std::is_member_function_pointer<decltype(&T::func)> {};    \#define DEFINE_MEMBERVARIABLE_TRAIT(name, memVariable)               \template <typename T, typename = void>                            \struct name : public std::false_type {};                          \\template <typename T>                                             \struct name<T, std::void_t<decltype(&T::memVariable)>>            \: std::is_member_object_pointer<decltype(&T::memVariable)> {};\DEFINE_MEMBERFUNCTION_TRAIT(HasFun123, Fun123)
DEFINE_MEMBERVARIABLE_TRAIT(HasName123, name123)struct XXX
{void Fun123() {}std::wstring name123;
};int main()
{if (HasFun123<XXX>::value){std::cout << "XXX::Fun123 exists" << std::endl;}if (HasName123<XXX>::value){std::cout << "XXX::name123 exists" << std::endl;}
}执行结果:
XXX::Fun123 exists
XXX::name123 exists

 

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

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

相关文章

Unity MonoBehaviour 单例和标准单例的区别

共同特点 单一实例&#xff1a;无论是 MonoBehaviour 单例还是标准单例模式&#xff0c;它们都保证类只有一个实例存在。 全局访问点&#xff1a;两种单例模式都提供一个全局访问点&#xff0c;允许从应用程序的任何地方访问单例实例。这通常是通过一个公共的静态方法或属性实…

spring-boot-admin的介绍和使用

概述 Spring Boot 有一个非常好用的监控和管理的源软件&#xff0c;这个软件就是 Spring Boot Admin。该软件能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供实时警报功能。 主要的功能点有&#xff1a; 显…

tcpdump 抓包无法落盘

文章目录 问题背景解决办法 问题背景 在嵌入式设备中(Linux系统)&#xff0c;为了分析两个网络节点的通讯问题&#xff0c;往往需要用到tcpdump&#xff0c;抓一个.pcap的包在PC端进行分析。博主在实际操作中发现&#xff0c;抓包无法实时落盘。 解决办法 # 下面的命令是写在…

面试八股文(2)

文章目录 1.ArrayList和LinkedList区别2.HashMap和HashTable区别3.线程的创建方式4.Java中异常处理5.Java序列化中某些字段不想进行序列化&#xff1f;6.Java序列化7.静态方法和实例方法8.List、Set、Map三者区别9.ArrayList和Vector区别10.HashMap和HashSet区别 1.ArrayList和…

还在用findViewById,不来了解下其它方式?

众所周知&#xff0c;都2225年了&#xff0c;如果你还在用Java敲安卓代码&#xff0c;findViewById已经是一种非常繁琐的操作&#xff0c;如果要去获取的id数量多&#xff0c;则对开发更加不友好。如果一个页面id过多&#xff0c;经常会有如下场景&#xff1a; TextView title…

ISOLAR-A/B问题总结

ISOLAR-A/B报错问题一&#xff1a; 1. Target ARObject: <ECUC-MODULE-CONFIGURATION-VALUES-REF> Unable to resolve reference /ETAS_Project/EcucModuleConfigurationValuess/E2E. - Line: 99. [Infos] <ECUC-MODULE-CONFIGURATION-VALUES-REF> : </ARPacka…

Pytest 与allure测试报告集成

通过Feature, story, step 记录测试的功能&#xff0c;场景及测试步骤 # login.pylogin_func函数 传入参数是name 和 password 当输入的name和password与数据库db_data中数据一致时&#xff0c;返回“XXX成功登录系统&#xff01;” 当输入的name存在于数据库db_data但密码不正…

Qt应用开发(安卓篇)——调用ioctl、socket等C函数

一、前言 在 Qt for Android 中没办法像在嵌入式linux中一样直接使用 ioctl 等底层函数&#xff0c;这是因为因为 Android 平台的安全性和权限限制。 在 Android 中&#xff0c;访问设备硬件和系统资源需要特定的权限&#xff0c;并且需要通过 Android 系统提供的 API 来进行。…

自定义SpringBoot启动图标

在SpringBoot项目的resources目录下创建banner.txt文件 在https://www.bootschool.net/网站上复制Ascll艺术字&#xff08;图&#xff09;粘贴到banner.txt中保存。 启动项目就会加载 可以修改颜色&#xff0c;和版本号 ${application.version} 输出版本 ${spring-boot.v…

【leetcode100-081到090】【动态规划】一维五题合集1

【爬楼梯】 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a; 【状态】 dp[i];//爬i级台阶有几种方法 【初始】 dp[0] 1;//爬0级1种&#xff08;不爬&#xff09;dp[1] 1;/…

剑指offer面试题14 调整数组顺序使奇数位于偶数前面

考察点 双指针遍历数组知识点 题目 分析 要求奇数位于偶数前面&#xff0c;如果按照循环遍历的方式&#xff0c;可以每找到一个偶数就把该数字后面所有的数都往前移动1位&#xff0c;然后把该偶数放在最后空出来的位置&#xff0c;这样的时间复杂度是O(n^2)。由于只要求奇数…

HubSpot是如何通过社交媒体与用户建立互动?

HubSpot善于利用社交媒体平台&#xff0c;与用户建立深度互动&#xff0c;增强用户对品牌的参与感与黏性。以下是HubSpot在社交媒体上建立互动的关键策略&#xff1a; 1. 及时回应用户评论&#xff1a;建立积极互动氛围 HubSpot注重在社交媒体上及时回应用户的评论。无论是表…

用的到的linux-文件移动-Day2

前言&#xff1a; 在上一节&#xff0c;我们复习了cd大法和创建生成文件和文件夹的方法&#xff0c;介绍了一些“偷懒”&#xff08;高效&#xff09;的小技巧&#xff0c;本节&#xff0c;我们一起来探讨下&#xff0c;我们对文件移动操作时有哪些可以偷懒的小技巧~ 一、复制…

引领AI创意教育新浪潮,瑞云AIGC实训平台解决方案来了

过去的2023年&#xff0c;AI&#xff08;人工智能&#xff09;成为了年度科技圈关键词&#xff0c;各行各业都在AI化&#xff0c;据统计&#xff0c;AIGC市场规模预计到2030年将达到万亿级别&#xff0c;这不仅是市场的趋势&#xff0c;更是创新的机遇。 教育行业更是如此&…

【网络基础】网络协议传输层UDP和TCP

UDP 解包和分用 解包&#xff08;解析数据包&#xff09; 捕获数据包&#xff1a;首先&#xff0c;接收端的网络栈捕获UDP数据包。检查目的端口&#xff1a;接收端检查数据包头部的目的端口&#xff0c;以确定哪个应用程序应该接收该数据包。验证校验和&#xff1a;接收端可能…

阿赵UE学习笔记——14、LOD

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法。这次看看虚幻引擎的Level Of Detail(LOD)的用法。 一、测试场景准备 用植物系统&#xff0c;在地形上面刷了好多草&#xff1a; 这个时候看一下网格&#xff0c;会发现网格比较多和密集。 …

CentOS部署Docker Registry镜像仓库并结合内网穿透实现远程访问

文章目录 1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)…

【灵活设置PostgreSQL的PROMPT1客户端提示符】

Prompting是指psql的客户端提示符&#xff0c;有三个变量&#xff1a;PROMPT1, PROMPT2, ROMPT3&#xff0c;具体区别如下: PROMPT1: 当psql等待新命令发出时的常规提示符&#xff0c;PROMPT1最常见。PROMPT2: 在命令输入过程中等待更多输入时发出的提示符&#xff0c;例如当命…

因子图、边缘化与消元算法的抽丝剥茧 —— Notes for “Factor Graphs for Robot Perception“

Title: 因子图、边缘化与消元算法的抽丝剥茧 —— Notes for “Factor Graphs for Robot Perception” 文章目录 I. 前言II. 因子图的基本概念1. 因子图的定义2. SLAM 中的因子图A. 因子图的图示B. 因子图的因式C. 因子图的二分图形式 III. 边缘化与消元运算的基本原理1. 边缘化…

全网最简单的幻兽帕鲁服务器搭建教程

幻兽帕鲁是一款备受欢迎的多人在线游戏&#xff0c;为了提供更好的游戏体验&#xff0c;许多玩家选择自行搭建服务器。本文将指导大家如何简单快速地搭建幻兽帕鲁服务器&#xff0c;轻松享受游戏的乐趣。 第一步&#xff1a;购买游戏联机服务器 购买入口&#xff1a;https://tx…