के साथ जीएसएल का उपयोग करते समय स्थैतिक सदस्य फ़ंक्शन से कैसे बचें I सदस्य पदों को static
के रूप में घोषित किए बिना सी ++ कक्षा के भीतर जीएसएल का उपयोग करना चाहते हैं। इसका कारण यह है क्योंकि मैं उन्हें बहुत अच्छी तरह से नहीं जानता और मुझे थ्रेड सुरक्षा के बारे में निश्चित नहीं है। जो मैंने पढ़ा है, std::function
एक समाधान हो सकता है लेकिन मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए।सी ++
मेरा प्रश्न g
की घोषणा में static
को कैसे हटा सकता है?
#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";
}
अद्यतन (1):
मैं gsl_monte_function G = { bind(&A::g, this,_1,_2,_3), 3, 0 };
करने के लिए gsl_monte_function G = { &g, 3, 0 };
बदल रहा करने की कोशिश की लेकिन यह
अद्यतन (2) काम नहीं किया: मैं assigning std::function to a member function का उपयोग कर की कोशिश की लेकिन यह 'नहीं था टी काम करते हैं।
अद्यतन (3) अंत में मैं एक गैर सदस्य समारोह लिखा है:
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;
};
यह काम किया लेकिन यह एक गंदा समाधान है क्योंकि मैं एक सहायक समारोह लिखने के लिए की जरूरत है। लैम्बडास, फ़ंक्शन और बाइंड के साथ, वर्ग के भीतर सब कुछ तार्किक रखने का एक तरीका होना चाहिए।
मुझे पता है कि मेरा उत्तर काफी देर से आया देखते हैं, लेकिन मुझे आशा है कि रैप वर्ग भविष्य में आप कर सकते हैं। यह रैप काफी आसान है क्योंकि यह आपको लैम्ब्डा फ़ंक्शंस को एकीकृत करने या एक से अधिक पैरामीटर के साथ फ़ंक्शंस को बाध्य करने की अनुमति देता है (यदि आप f (x, a) = x को एकीकृत करना चाहते हैं जहां उदाहरण के लिए पैरामीटर है)। –