首先,我知道在C ++中这是不可能的。但我希望有人可以告诉我解决问题的方法。我有一个代表数学函数的类:
class myClass:
{
private:
public:
myClass() {};
double value(double, double){ /* doing some complicated calculation here */} };
double integrate { /*calc*/ return integral; };
}
在integrate()
中,我想创建一个引用value()
的结构。结构定义如下:
struct gsl_monte_function_struct {
double (*f)(double * x_array, size_t dim, void * params);
size_t dim;
void * params;
};
(我需要这个结构来调用GSL的Monte-Carlo集成例程)
如前所述,我知道这在C ++中是被禁止的。但是有没有可能将gsl_monte_function_struct
与myClass的成员函数一起使用?如果myClass
无法自行整合,是否可以从{+ 1}}以外的gsl_monte_function_struct
作为参考?提前谢谢!
答案 0 :(得分:1)
如果您理解正确,则需要指向成员函数myClass
的指针。您可以通过将成员函数指针声明为:
double (myClass::*value)(double,double)
以后可以在实例上调用此函数:
(instance.*value)(x,y);
或者,您可以使用std::bind
创建一个函数对象,该函数对象可以作为普通函数调用,而无需在调用std::bind
之后跟踪调用它的实例:
auto& value = std::bind(myClass::value, instance);
// ....
value(x,y);
答案 1 :(得分:0)
好的到目前为止我找到了两个解决方案:
1)(通用解决方案)使用一个抽象基类,它具有指向当前实例的静态指针和一个调用派生类函数的静态函数。静态函数可以与函数指针一起使用。
示例:
struct gsl_monte{
double (*f)(double y);
};
class myBase {
private:
static myBase* instance;
public:
myBase(){};
static void setInstance(myBase* newOne);
virtual double value(double x) =0;
static double callValue(double x);//{return value(x);}
};
class myClass : public myBase {
public:
myClass(){};
double value(double x) { return x; };
};
myBase* myBase::instance = new myClass();
double myBase::callValue(double x){return instance->value(x);}
void myBase::setInstance(myBase* newOne){instance=newOne;};
double g(double xx) {return xx;};
int main(int argc, char** argv ){
double x[2]; x[0]=1.3; x[1]=1.3;
myClass* instance = new myClass();
myBase::setInstance(instance);
instance->value(3);
std::cout << "Test " << myBase::callValue(5) << std::endl;
gsl_monte T;
T.f=&myBase::callValue;
double (*f)(double y, void*) = &myBase::callValue;
}
2)(特定于我的问题的解决方案)幸运的是,所需的函数接受一个参数指针,我可以使用它来传递当前对象:
#include <iostream>
#include <functional>
using namespace std::placeholders;
struct gsl_monte{
double (*f)(double y, void*);
};
class myClass {
public:
myClass(){};
double value(double x) { return x; };
};
double valueTT(double x, void* param) { return static_cast<myClass*>(param)->value(x); };
int main(int argc, char** argv ){
double x[2]; x[0]=1.3; x[1]=1.3;
myClass* instance = new myClass();
instance->value(3);
gsl_monte T;
T.f=&valueTT;
double (*f)(double y, void*) = &valueTT;
}