指向类成员函数的指针,作为外部函数的参数

Pointer to class member function as an argument to external function

本文关键字:函数 外部 参数 指针 成员      更新时间:2023-10-16

我试图实现OpenGL库的一些类方法,但我在函数指针方面遇到了问题。无论如何,假设我们有C++代码:

int funct1(int x){
    return x*x;
}
class foo{
public:
    int funct2(int x){
        return x*x;
    }
};
int conv(int (*f)(int)){
    return f(1);
}
int main(){
    conv(funct1);
    foo bar;
    conv(funct2);
}

我确实意识到funct2是foo类的内部方法,但试图将conv(funct2)更改为类似conv(bar.funct2)的方法会出现以下错误:

argument of type ‘int (foo::)(int)’ does not match ‘int (*)(int)’

我试着在其他类似的帖子中寻求帮助,但总是很复杂。有人可以在这里张贴更改后的工作代码吗?

将funct2声明为静态

int funct1(int x){
return x*x;
}
class foo{
public:
static int funct2(int x){
return x*x;
}
};
int conv(int (*f)(int)){
return f(1);
}
int main(){
conv(funct1);
foo bar;
conv(foo::funct2);
}

如果您的编译器支持c++11,您可以执行以下操作:

#include<functional>
int funct1(int x){
    return x*x;
}
class foo{
public:
    int funct2(int x){
        return x*x;
    }
};
int conv(int (*f)(int)){
    return f(1);
}
int main(){
    conv(funct1);
    foo bar;
    auto boundFunct2 = std::function<int(int)>(std::bind(&foo::funct2,bar,std::placeholders::_1));
    conv(boundFunct2.target<int(int)>());
}

基本上,您将funct2绑定到类的一个实例,即bar,然后从中创建一个函数对象。为了使其生成conv()所需的签名,您可以调用函数对象上的目标成员。

好处是你不必更改任何函数或类,我假设你不能更改,因为它们可能是openGL库对象。

我找到了解决这个问题的好方法:

class MyClass;
static MyClass* ptr;
class MyClass{
void Func(){something;}
static void Func2(){ptr->Func();}
void RunFunc(){
ptr=this;
RunningExternalFunction(Func2);
}
};

哇!