You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否传递非静态类方法替代函数并指定不同的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:17:16