怎样将成员函数指针强制转换成void*指针?

c++中的void* 今天看到一段代码,觉得非常有意思。 void* say_hello(void* args) { cout << "Hello World!" << endl; return 0; } 这里的返回类型竟然是void*。一般来说如果没有返回值,那么写一个void就行了,void*到底是什么样的存在?所以做了一些测试,总结了一些void*指针的... 阅读详情

    采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如unsigned*,当然同样可以通过此转化后的指针经过相反的变换来调用成员函数。于是乎要转化为void*的问题也随之可解,如下示例:
/* VS2003下编译运行 */
class AbstractMethod
{
public:
 virtual void show(){}  // = 0;  // 可以是纯虚函数,这里为了测试方便不使用纯虚函数!

 void fun()
 {
  cout << "I was called!" << endl;
 }

 void fun1()
 {
  cout << "I was called!" << endl;
 }
};

int main()
{
 // 定义成员函数指针类型
 typedef void (AbstractMethod::*MFP)(void);

 // 转化函数指针为别的指针
 MFP mfp1 = &AbstractMethod::show; 
 unsigned* tmp =  (unsigned*)&mfp1;
 cout << hex << *tmp << endl;

 MFP mfp2 = &AbstractMethod::fun;
 tmp = (unsigned*)&mfp2;
 cout << hex << *tmp << endl;

 MFP mfp3 = &AbstractMethod::fun1;
 tmp = (unsigned*)&mfp3;
 cout << hex << *tmp << endl;

 // 通过转化后的指针调用成员函数
 AbstractMethod am;
 MFP* addr = (MFP*)tmp;
 (am.*mfp3)();
 (am.*(*addr))();

 return 0;
}

验证上述方法取得的成员函数地址是否正确:
1. 在调试是查看临时变量函数指针的值和输出的是否一样。
2. 可以根据调试时的反汇编进行结果验证。
3. 最好的办法就是如上例子通过转化后的指针来调用成员函数。

Copyright@戴维 2006.5  于北京 

2 海康视觉平台VisionMaster 上手系列:大纲及准备 海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉 阅读详情

相关推荐

【Boost5】Boost变换器的输入电容

节点的电流有3个,一个是来自电源输入的,由于我们把Vin看成理想电源以及线路的电感的存在,它可以近似看作是恒定的电流源Iin,一个是流向输入电容Cin的电流Icin,另外一个节点是电感L电流IL。电容电流波形在整个开关周期内的平均值为0,充电和放电在一个周期中各占1/2,在图中充电部分面积和放电部分面积相等,那么在充电或放电的电荷量Q=I*t,从图中可以看出,在一个周期内电容电流变化量是ΔIL,那在电容在充电1/2T周期中电流的变化量是1/2ΔIL。输入电容上的ESR也会随着电流变化,影响输入电压的变化。

qq_43416206的博客 3348

将类的成员函数指针转化为一般的函数指针的方法

以下代码实现的功能是void*(class::*)(void*) 转化为void*(*)(void*)    即将类的成员函数指针转化为一般的函数指针#include #include template T supercast(F f) { union FT { T t; F f; }; FT ft; ft.f=f; return ft

lgp88的专栏 3499

数字IC后端PPA优化实战:Timing一致性策略与Module Region布局技巧

本文深入探讨了数字IC后端设计中的PPA优化实战,重点解析了Timing一致性问题及其解决方案。通过调整Clock Uncertainty、Timing Derate和RC Scale Factor等关键参数,使Innovus等PR工具的分析结果更接近PrimeTime签核结果。同时,文章详细介绍了Module Region布局技巧,通过为关键模块划定物理区域,优化单元摆放,有效减少线延迟,从而协同提升时序收敛效率与设计可预测性。

weixin_29218963的博客 203

怎样将成员函数指针强制转换成void*指针

采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如unsigned*,当然同样可以通过此转化后的指针经过相反的变换来调用成员函数。于是乎要转化为void*的问题也随之可解,如下示例:/* VS2003下编译运行 */class AbstractMethod{public: virtual void show(){}  // = 0;  // 可以是纯虚函数,这里为了测...

随意的风的专栏 6722

CentOS 7下Oracle 11G RAC静默安装避坑指南:从网络规划到共享存储配置全流程

本文详细介绍了在CentOS 7环境下进行Oracle 11G RAC静默安装的全流程,包括网络规划、共享存储配置和系统参数调优等关键步骤。特别针对静默安装过程中的常见问题提供了实用的避坑指南和优化建议,帮助技术人员高效完成企业级数据库部署。

weixin_29234509的博客 124

CREO5.0二次开发+VS2019配置详解

CREO5.0+VS2019配置更新 一、CREO5.0 配置 二、Visual Studio 2019配置 新建MFC DLL项目 文件>新建>项目,选择MFC DLL,如下图所示 项目名称CREO1 2、配置设置 打开项目属性: 配置资源管理器设置: 设置包含目录、库目录(根据自己CREO的安装位置来设置): 包含目录: 库目录: 预处理器设置: 把下面文字复...

liuyi2517的博客 1万+

取指定数值的地址 (int 转 void *)

Error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]

wqs880527的博客 1730

MIT 6.824分布式 LAB4A:ShardCtrler

lab 4要求实现一个使用raft共识算法的分片存储系统。而在lab 4a中,我们仅需实现分片控制器的功能。lab4中的分片存储系统有多个分片,这些数据分布在众多分片上,而每个分片都对应着一个集群组,可能一个集群组负责多个分片,一个集群组内的所有服务器都会使用raft共识算法进行状态的复制。而本实验的重点为分片控制器,主要负责的工作是对集群组和分片之间关系的管理,我们仅需在/src/shardctrler文件夹中对client.go,server.go,common.go这三个文件进行修改即可。注意事项(实

MarksSa的博客 832

void类型指针,即void*

void类型的指针(即void*)一般用法和注意事项

crawer 5552

零基础实战:用 Docker 和 vLLM 本地部署 BGE-M3 文本嵌入模型

BGE-M3是北京智源推出的多功能文本嵌入模型,支持跨语言语义匹配。利用Docker容器化和vLLM框架可高效部署该模型,实现本地运行的优势包括隐私保护、定制化和成本控制。通过配置Docker环境,使用vLLM官方镜像加载模型,并进行文本嵌入测试验证效果。该方案适合开发者快速验证模型能力,或集成到本地NLP流程中。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 4953

面向边缘计算的YOLOv12模型剪枝-蒸馏联合优化实战教程**

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

FJN110的博客 158

C++中的void*理解

目录 1. void *是什么? 1.1 跳跃力什么时候定? 2. void*详解 2.1 void*可以指向任何类型的地址,但是带类型的指针不能指向void*的地址 2.2 void*指针只有强制类型转换以后才可以正常取值 2.3 void*指针变量和普通指针一样可以通过等于0或者NULL来初始化,表示一个空指针 2.4 当void*指针作为函数的输入和输出时,表示可以接受任意类型的输入指针和输出任意类型的指针 2.5 和void的区别 3.作用及典型应用 3.1 函数传参时不确定类.

W_H_M_2018的博客 2万+

端到端自动驾驶的精准测试场景开发

1. 背景介绍 自动驾驶技术的发展正在改变交通运输的未来,然而,要实现安全可靠的自动驾驶,需要进行大量的测试和验证。端到端自动驾驶系统的测试场景开发是实现这一目标的关键。本文将详细介绍端到端自动驾驶的精准测试场景开发,包括核心概念、算法原理、数学模型、项目实践,以及未来发展趋势。 2. 核心概念与联系

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1319

C语言-void与void*详解

内容包括void的含义与使用、void (*b[10]) (void (*)( ));的解说。

让你爱上电路设计 8469

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

空指针和void *类型指针

今天,有个师弟问我:“师兄,空指针和void *类型指针是怎样的?” 当时,我大概的说法是: 1、空指针是没有指向的指针,将暂时用不到的指针定义成空指针,能防止误用。 2、而void * 类型的指针是有指向的指针,但它的指向的数据的类型暂时不确定,所以先弄成void * 类型,后期一般要强制转换的。 回来后,发现这种说法虽然勉强能够接受,但依然有不足的地方,现在补充更正一下: 1

luo_technically的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c语言中void *的使用

使用void* 时要进行强制类型转换: int value =2; myFunc((void*)&value);//函数调用时 myFunc(void *temp)//函数定义 { int result = *((int*)temp);//转换回来 } 形参为void*的优势: 我们以pthread_create()函数为例分析如下: #include...

modi000的博客 6578

c语言void*指针,C语言void指针

C语言void指针教程在 void 的意思就是 “无类型”,void 指针则为 “无类型指针”,void 指针可以指向void指针使用在 C 语言中在任何时候都可以用 void 类型的指针来代替其他类型的指针,void 指针可以指向任何数据类型的变量。如果要通过 void 指针去获取它所指向的变量值时候,需要先将 void 指针强制类型转换成和变量名类型相匹配的数据类型指针后再进行操作。任何类型的...

weixin_27743991的博客 2818

无类型指针void*的学习与使用

C/C++中的指针介绍和void*指针的学习

leo的小作坊 1万+

【zz】将成员函数指针强制转换成void指针

 采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如unsigned*,当然同样可以通过此转化后的指针经过相反的变换来调用成员函数。于是乎要转化为void*的问题也随之可解,如下示例: /* VS2003下编译运行 */class AbstractMethod{public: virtual void show(){}  // = 0;  

geminiyao_0613的专栏 675

void 类型指针以及指针数组

void 类型比较特殊,它可以表示所有的类型,但是又不能像其他类型那样声明成实体。在很多项目中的函数的参数使用void* 型数组,在void*数组中,即可以有int型,可以有char型,也可以有结构体,将这些参数放在一个void* 型数组中。 值得注意的是,不能直接使用void型变量,而是使用void*,即void 型的指针。 比如:int a; void b; void* c;这里第一行声

chomo的专栏 1万+
上一篇: C++对象及多态实现探索之内存布局
下一篇: 排列组合问题的通用算法
sharpdew
博客等级 码龄23年 76粉丝 35原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值