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

时间:2014-09-19 13:05:23

标签: c++ function pointers

我正在尝试为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)’

我试图在其他帖子中寻求帮助 - 但总是非常复杂。有人可以在这里发布更改并在此处运行代码吗?

3 个答案:

答案 0 :(得分:1)

将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);
}

答案 1 :(得分:0)

如果您的编译器支持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库对象。

答案 2 :(得分:0)

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

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

瞧!