我正在尝试为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)’
我试图在其他帖子中寻求帮助 - 但总是非常复杂。有人可以在这里发布更改并在此处运行代码吗?
答案 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);
}
};
瞧!