c++ - pointer convert - class member function‘s pointer <==> void*

文章目录

    • c++ - pointer convert - class member function's pointer <==> void*
    • 概述
    • 笔记
    • END

c++ - pointer convert - class member function’s pointer <==> void*

概述

想将结构体中的void指针赋值为类成员函数的指针, 用于回调.
这个结构体相关的函数写完, 就不用再因为传入的类指针是不同的业务类, 而再去修改这个类指针的类型为 X

直接将类成员函数指针转为void是不行的, 编译器不支持.
试了一下, 可以将类成员函数指针的地址再转成void**, 这样可以. 等于是结构体中的void
指针是一个2级指针.

笔记

/*!
* \file exp006_fun_pt_to_void_pt.cpp
* \note c++ - pointer convert - class member function's pointer <==> void*
*/#include "my_openSSL_lib.h"
#include <openssl/crypto.h>
#include <openssl/bio.h>#include <stdlib.h>
#include <stdio.h>
#include <assert.h>#include "CMemHookRec.h"void my_openssl_app();
void my_fn_test();class CTest
{
public:CTest(){}virtual ~CTest(){}int Add(int a, int b){return (a + b);}
};int main(int argc, char** argv)
{setvbuf(stdout, NULL, _IONBF, 0); // 清掉stdout缓存, 防止调用printf时阻塞mem_hook();my_openssl_app();mem_unhook();return 0;
}void my_openssl_app()
{// 做个实验, 将类成员函数指针强转为普通指针// 一切皆可强转为普通指针typedef void(*PFN_my_fn_test)();typedef int(CTest::* PFN_Add)(int a, int b);int i = 0;// 普通函数强转为普通指针void* p = my_fn_test;if (NULL != p){// 将普通指针转成普通函数指针来干活PFN_my_fn_test pfn = (PFN_my_fn_test)p;pfn();}// 类成员函数强转为普通指针CTest test;PFN_Add pClassMemberFn = &CTest::Add;// _ppVoidPt_ClassFn 也可以定义成void*, 反正是要按照2级指针来用才行.void** _ppVoidPt_ClassFn = (void**)&pClassMemberFn; // 到此, 将类成员函数指针转为了普通指针// 此时可以将_ppVoidPt_ClassFn 传进参数结构体中的void*成员, 这样参数结构体中的类函数指针就可以没有具体类型了, 不用包具体类的头文件(避免污染参数结构体中的指针类型)// 这样做出的结构体, 可以给任意类来用. 只要结构体中的指针用途定好了, 以后就再也不用改结构体中的指针类型.// 网上能查到的普通用法 : 用类的this指针和类成员函数指针来干活CTest* pClassThis = &test;i = (pClassThis->*pClassMemberFn)(1, 2);printf("(pClass->*pClassFn)(1, 2) = %d\n", i);// 网上能查到的普通用法 : 用类实例对象和类成员函数指针来干活i = (test.*pClassMemberFn)(2, 3);printf("(test.*pClassFn)(2, 3) = %d\n", i);// 网上未见的用法 - 将void*指针转成类指针来干活// 其他用到类回调指针来干活时, 他这时本来就知道这个类指针具体啥类型的(因为就是他传入的), 将void*指针强转成类指针来用.// 可以分为2步将void*指针转为类指针PFN_Add* ppClassFn_restore = (PFN_Add*)_ppVoidPt_ClassFn;PFN_Add pClassFn_restore = *ppClassFn_restore;i = (test.*pClassFn_restore)(3, 4);printf("(test.*pClassFn_restore)(3, 4) = %d\n", i);// 也可以1步将void*指针转为类指针PFN_Add pClassFn_restore1 = *(PFN_Add*)_ppVoidPt_ClassFn;i = (test.*pClassFn_restore1)(4, 5);printf("(test.*pClassFn_restore1)(4, 5) = %d\n", i);/*! run resut>> my_fn_test(pClass->*pClassFn)(1, 2) = 3(test.*pClassFn)(2, 3) = 5(test.*pClassFn_restore)(3, 4) = 7(test.*pClassFn_restore1)(4, 5) = 9free map, g_mem_hook_map.size() = 0*/
}void my_fn_test()
{printf(">> my_fn_test\n");
}

END

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

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

相关文章

Stable Diffusion中的Clip模型

基础介绍 Stable Diffusion 是一个文本到图像的生成模型&#xff0c;它能够根据用户输入的文本提示&#xff08;prompt&#xff09;生成相应的图像。在这个模型中&#xff0c;CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;模型扮演了一个关键的角色&a…

Biotin aniline,生物素苯胺,用于研究蛋白质结构和功能

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺&#xff0c;Biotin-aniline&#xff0c;生物素-苯胺 一、基本信息 【产品简介】&#xff1a;Biotin aniline is composed of three parts: biotin, w…

个人或者小团队选择C语言还是c++?

个人或者小团队选择C语言还是c? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff0…

使用Python语言实现一个基于动态数组的序列队列

一、动态数组的实现 首先&#xff0c;我们需要创建一个DynamicArray类&#xff0c;该类将管理我们的动态数组。 动态数组能够动态地调整其大小&#xff0c;以容纳更多的元素。 目录 一、动态数组的实现 代码示例&#xff1a; 二、序列队列的实现 接下来&#xff0c;我…

学习JAVA的第八天(基础)

目录 多态 前提 形式 测试类 调用成员的特点 优势 劣势 包 注意事项&#xff1a; final关键字 常量 命名规范&#xff1a; 注意事项&#xff1a; 权限修饰符 分类 代码块 局部代码块 构造代码块 静态代码块 抽象类 抽象类&#xff1a; 定义格式 抽象…

代码随想录算法训练营第五天

● 自己看到题目的第一想法 242. 有效的字母异位词 方法&#xff1a; 方法一&#xff1a; 暴力法 1. 分别对s, t排序 2. 遍历s与t 判断s[i]!t[i] 返回 false 否则 返回true思路&#xff1a; 注意&#xff1a; 代码&#xff1a; bool cmp(char a, char b){return a<b;…

网站搭建的基本流程是什么?

网站搭建的基本流程是什么? 我们选择了白嫖雨云的二级域名 浏览器输入https://www.rainyun.com/z22_ 创建账号然后选择一个你喜欢的子域名我建议后缀选择ates.top的 选择自定义地址&#xff0c;类型选择cname 现在要选择记录值了&#xff0c;有a&#xff0c;aa&#xff0c;txt…

【Logback】Logback 的配置文件

目录 一、初始化配置文件 1、logback 配置文件的初始化顺序 2、logback 内部状态信息 二、配置文件的结构 1、logger 元素 2、root 元素 3、appender 元素 三、配置文件中的变量引用 1、如何定义一个变量 2、为变量设置默认值 3、变量的嵌套 In symbols one observe…

Swift的基本数据类型

1. Int类型&#xff1a;用于表示整数&#xff0c;包括正整数和负整数。 let age: Int 30 let numberOfStudents 50 2. Double和Float类型&#xff1a;用于表示浮点数&#xff0c;即带有小数点的数值。Double提供更高的精度&#xff0c;而Float提供较低的精度。 let pi: Do…

如何压缩word文档中的图片大小?一键批量压缩~

在日常工作和学习中&#xff0c;我们经常需要创建和编辑Word文档&#xff0c;并在其中插入图片来丰富内容。然而&#xff0c;随着图片的增加&#xff0c;Word文档的大小可能会急剧增加&#xff0c;导致文件变得庞大&#xff0c;不便于传输和共享。针对这个问题&#xff0c;本文…

C++/WinRT教程(第四篇)WinRT 的错误和异常处理

目录 前言 避免捕获和抛出异常 捕获异常 抛出异常 编辑API时抛出异常 使用 noexcept 时如何调试 调用同步代码 快速失败 断言 前言 本文主要介绍 C/WinRT 中的异常如何使用以及使用原则&#xff0c;如果你刚开始接触WinRT&#xff0c;建议先阅读第一篇。 C/WinRT教程…

67-箭头函数,new.target,模版字符串

1.箭头函数 ES6新增语法&#xff0c;用来简化函数的书写()>{} <script>//箭头函数的基本使用let a (a,b)>{return ab;}let c a(1,2);console.log(c);//输出3</script> 2.简写形式&#xff1a; 2.1参数&#xff1a;只有一个参数时可以省略小括号a>{}&…

面试经典 150 题 ---- 轮转数组

面试经典 150 题 ---- 轮转数组 轮转数组方法一&#xff1a;使用额外的数组方法二&#xff1a;数组翻转 轮转数组 方法一&#xff1a;使用额外的数组 我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度&#xff0c;我们遍历原数组&#xff0c;将原数组…

Java底层自学大纲_JVM篇

JVM专题_自学大纲所属类别学习主题建议课时&#xff08;h&#xff09; A 深入理解Java虚拟机001 JVM类加载器设计原理2.5 A 深入理解Java虚拟机002 基于SPI破解双亲委派机制2.5 A 深入理解Java虚拟机003 JVM内部结构分析2.5 A 深入理解Java虚拟机004 字符串常量池原理2.5 …

【算法】长短期记忆网络(LSTM,Long Short-Term Memory)

这是一种特殊的循环神经网络&#xff0c;能够学习数据中的长期依赖关系&#xff0c;这是因为模型的循环模块具有相互交互的四个层的组合&#xff0c;它可以记忆不定时间长度的数值&#xff0c;区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。 原理 黄…

37.云原生之springcloud+k8s+GitOps+istio+安全实践

云原生专栏大纲 文章目录 准备工作项目结构介绍配置安全测试ConfigMapSecret使用Secret中数据的方式Deployment使用Secret配置Secret加密 kustomize部署清单ConfigMap改造SecretSealedSecretDeployment改造Serviceistio相关资源DestinationRuleGatewayVirtualServiceServiceAc…

132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸,具有优异的反应活性和光学性能

132557-72-3&#xff0c;5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0c;2,3,3-三甲基-3H-吲哚-5-磺酸&#xff0c;具有优异的反应活性和光学性能&#xff0c;一种深棕色粉末 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;132557-72-3&#xff0c;5…

ROS2体系框架

文章目录 1.ROS2的系统架构2.ROS2的编码风格3.细谈初始化和资源释放4.细谈配置文件5.ROS2的一些命令6.ROS2的核心模块6.1 通信模块6.2 功能包6.3 分布式6.4 终端命令和rqt6.5 launch6.6 TF坐标变换6.7 可视化RVIZ 1.ROS2的系统架构 开发者的工作内容一般都在应用层&#xff0c;…

MySQL学习Day24—数据库的设计规范

一、数据库设计的重要性: 1.糟糕的数据库设计产生的问题: (1)数据冗余、信息重复、存储空间浪费 (2)数据更新、插入、删除的异常 (3)无法正确表示信息 (4)丢失有效信息 (5)程序性能差 2.良好的数据库设计有以下优点: (1)节省数据的存储空间 (2)能够保证数据的完整性 …

力扣138.随机链表的复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…