Ich möchte GSL innerhalb einer C++ - Klasse ohne Deklaration Memberfunktionen wie static
. Der Grund dafür ist, dass ich sie nicht gut kenne und ich bin mir nicht sicher über die Sicherheit von Fäden. Von dem, was ich gelesen habe, std::function
könnte eine Lösung sein, aber ich bin mir nicht sicher, wie man es benutzt.Wie zu vermeiden, statische Member-Funktion bei der Verwendung von GSL mit C++
Meine Frage kommt zu, wie kann ich static
in der Erklärung von g
entfernen?
#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";
}
Update (1):
Ich versuchte gsl_monte_function G = { &g, 3, 0 };
-gsl_monte_function G = { bind(&A::g, this,_1,_2,_3), 3, 0 };
ändern, aber es hat nicht funktioniert
Update (2): ich versucht, mit assigning std::function to a member function aber es didn‘ t arbeiten entweder.
Update (3) am Ende habe ich eine Nicht-Mitglied-Funktion:
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;
};
Es funktionierte, aber es ist eine schmutzige Lösung, weil ich eine Hilfsfunktion zu schreiben, benötigt. Mit lambdas, function und bind sollte es einen Weg geben, alles logisch in der Klasse zu haben.
Ich weiß, dass meine Antwort ziemlich spät kam, aber ich hoffe, dass Wrap Klasse, die Ihnen in der Zukunft helfen kann. Dieser Wrap ist sehr praktisch, da er auch die Integration von Lambda-Funktionen oder das Binden von Funktionen mit mehr als einem Parameter ermöglicht (wenn Sie f (x, a) = a x integrieren wollen, wobei a beispielsweise ein Parameter ist). –