jak uniknąć funkcji składowej statycznej podczas używania gsl z c ++

Chciałbym używać GSL w klasie c ++ bez deklarowania funkcji członkowskich jakostatic. Powodem tego jest to, że nie znam ich zbyt dobrze i nie jestem pewien bezpieczeństwa nici. Z tego co przeczytałemstd::function może być rozwiązaniem, ale nie jestem pewien, jak go użyć.

Moje pytanie sprowadza się do tego, jak mogę usunąćstatic w deklaracjig?

#include<iostream>
#include <functional>
#include <stdlib.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_monte.h>
#include <gsl/gsl_monte_plain.h>
#include <gsl/gsl_monte_miser.h>
#include <gsl/gsl_monte_vegas.h>


using namespace std;

class A {
public:
  static double g (double *k, size_t dim, void *params)
  {
    double A = 1.0 / (M_PI * M_PI * M_PI);
    return A / (1.0 - cos (k[0]) * cos (k[1]) * cos (k[2]));
  }
  double result() {
    double res, err;

    double xl[3] = { 0, 0, 0 };
    double xu[3] = { M_PI, M_PI, M_PI };

    const gsl_rng_type *T;
    gsl_rng *r;

    ////// the following 3 lines didn't work ///////
    //function<double(A,double*, size_t, void*)> fg;
    //fg = &A::g;
    //gsl_monte_function G = { &fg, 3, 0 };
    gsl_monte_function G = { &g, 3, 0 };

    size_t calls = 500000;

    gsl_rng_env_setup ();

    T = gsl_rng_default;
    r = gsl_rng_alloc (T);

    {
      gsl_monte_plain_state *s = gsl_monte_plain_alloc (3);
      gsl_monte_plain_integrate (&G, xl, xu, 3, calls, r, s, &res, &err);
      gsl_monte_plain_free (s);
    }

    gsl_rng_free (r);
    return res;
  }
};

main() {
  A a;
  cout <<"gsl mc result is " << a.result() <<"\n";
}

Aktualizuj (1):

Próbowałem się zmienićgsl_monte_function G = { &g, 3, 0 }; dogsl_monte_function G = { bind(&A::g, this,_1,_2,_3), 3, 0 }; ale to nie zadziałało

Aktualizacja (2): Próbowałem użyćprzypisanie funkcji std :: do funkcji składowej ale to też nie zadziałało.

Aktualizacja (3) w końcu napisałem funkcję niebędącą członkiem:

double gmf (double *k, size_t dim, void *params) {
  auto *mf = static_cast<A*>(params);
  return abs(mf->g(k,dim,params));
  //return 1.0;
};

Zadziałało, ale jest to nieuporządkowane rozwiązanie, ponieważ musiałem napisać funkcję pomocniczą. W przypadku lambd, funkcji i powiązań powinien istnieć sposób na to, aby wszystko było logiczne w klasie.

questionAnswers(4)

yourAnswerToTheQuestion