4
4

1 に答える 1

6

void*関数定義の は、ユーザー指定のコールバック パラメータであると思います。その場合、このパラメーターを使用してポインターをオブジェクトに渡し、コールバックを静的関数にします。この静的関数内で、このポインターを適切な型 ( Experiment*) にキャストし直し、非静的バージョンの関数を呼び出します。

class Experiment
{
public:
    Experiment();
    ~Experiment();

    void setupExperiment();
    static int static_func(double t, const double y[], double f[], void *params);
    static int static_jac (double t, const double y[], double *dfdy, double dfdt[], void *params);
    virtual int func(double t, const double y[], double f[]);
    virtual int jac (double t, const double y[], double *dfdy, double dfdt[]);
};

void Experiment::setupExperiment()
{
    gsl_odeiv2_system sys = {static_func, static_jac, 2, this}; //Here is the problem with virtual functions
}

int Experiment::static_func(double t, const double y[], double f[], void *params)
{
  return ((Experiment*)params)->func(t, y, f);
}

int Experiment::static_jac (double t, const double y[], double *dfdy, double dfdt[], void *params)
{
  return ((Experiment*)params)->jac(t, y, dfdy, dfdt);
}

class aSpecificProblem: public Experiment
{
public:
    virtual int func(double t, const double y[], double f[]);
    virtual int jac (double t, const double y[], double *dfdy, double dfdt[]);
};
于 2012-05-21T14:45:21.757 に答える