我想将功能与gsl集成。因此,我必须定义一个函数f
(整数,必须是double (*)(double, void*)
形式)。对于gsl集成方法的调用,我需要定义一个struct,它包含一个指向函数的指针(这个结构称为gsl_function
)。
gsl_function F;
F.function = &MyClass::my_f;
函数f
必须在类中实现(在应该调用集成过程的同一个类中)。如何正确分配上面的指针,因为第二行没有编译并导致错误:
cannot convert ‘double (MyClass::*)(double, void*)’ to ‘double (*)(double, void*)’ in assignment.
这里是my_f
struct my_f_params { double a; double b;};
double my_f (double x, void * p) {
struct my_f_params * params = (struct my_f_params *)p;
double a = (params->a);
double b = (params->b);
return 1.0/(sqrt(a * (1.0 + x)*(1.0 + x)*(1.0 + x) + (1-a) * std::pow((1.0 + x), (3.0 * (1.0 + b)))));
}
答案 0 :(得分:1)
必须是
的形式double (*)(double, void*)
非静态成员函数声明涉及隐式调用作用域限定符,如错误消息
中所述double (MyClass::*)(double, void*)
// ^^^^^^^^^
这与回调函数指针定义不同。
您可以使用此类接口执行的操作是将this
指针传递回回函数的void*
参数:
class MyClass {
static double func(double d,void* thisPtr) {
MyClass* myClass = (MyClass*)thisPtr;
// do something
}
};
如上所述in the documentation,您可以在包装类中设置类似的参数:
class gsl_function_wrapper {
public:
gsl_function_wrapper() {
F.function = &func;
F.params = this;
}
private:
gsl_function F;
double a;
double b;
static double func(double d,void* thisPtr) {
gsl_function_wrapper* myWrapper = (gsl_function_wrapper*)thisPtr;
// do something with a and b
foo(d,myWrapper->a,myWrapper->b);
}
};