能否传递非静态类方法替代函数并指定不同的this指针?
可以实现,这么改就行
首先你代码里犯了个低级错误:拿成员函数地址不能写c.m,得用&C::m——这才是获取非静态成员函数指针的正确方式,类型是int(C::*)(int)。
虽然C++标准没明确允许成员函数指针和普通函数指针之间的reinterpret_cast,但主流编译器(GCC、Clang、MSVC)的实现逻辑里,非静态成员函数本来就是把this作为第一个隐式参数传递的,刚好和f要求的int(*)(C*, int)签名完全匹配。所以这么转换是能跑通的,而且能正确指定不同的this指针。
改好的代码如下:
#include <iostream> class C{ private: int a; public: C(int a):a(a){}; int m(int b){ return a + b; } }; void f(int(*fp)(C*,int)){ C c(20); std::cout << fp(&c, 5) << std::endl; // 这里的&c就是传给m的this指针 } int main(int argc, char *argv[]) { // 正确取成员函数地址并转换 f(reinterpret_cast<int(*)(C*,int)>(&C::m)); return 0; }
运行后会输出25,说明f里的c被正确当成m的this指针使用,计算的是20+5=25。
要注意的点
- 这种转换是编译器实现层面的行为,不是C++标准规定的可移植写法,换冷门架构或编译器可能出问题,但桌面平台的主流编译器都能正常工作。
- 调用转换后的函数指针时,第一个参数必须是
C类的有效对象指针,乱传会直接导致非法内存访问。
内容的提问来源于stack exchange,提问作者404
相关产品推荐
相关产品推荐

