Est-il possible en C++ de créer efficacement une fermeture qui sera un pointeur de fonction? J'utilise la bibliothèque scientifique Gnu et je dois créer un gsl_function. Cette fonction doit effectivement "fermer" quelques paramètres disponibles lorsque je le crée. Existe-t-il une astuce pour créer une fermeture afin que je n'ai pas besoin de les passer tous en params dans la structure gsl_function? Si non, devrais-je juste passer un pointeur vers un tableau contenant ces paramètres?Pointeurs de fonction fonctionnant comme des fermetures en C++
EDIT J'ai essayé d'utiliser boost :: bind comme ceci:
#include <gsl/gsl_integration.h>
#include <boost/bind.hpp>
#include "bondpricecalculator.h"
#include "functions.h"
double integrand (double xi, double t, double x, void * p) {
Functions *functions = (Functions *) p;
double vx = functions->v(x);
return functions->rho0(x)*exp(vx * xi - 0.5 * vx * vx * t);
}
double BondPriceCalculator::value(double t, double T, double xi)
{
gsl_integration_workspace * w
= gsl_integration_workspace_alloc (10000);
gsl_function F;
F.function = &boost::bind(integrand, xi, t, _1, _2);
F.params = &functions;
double integral_t;
double integral_T;
double error;
int res = gsl_integration_qags(&F, T, 1e+14, 0, 1e-7, 10000, w, &integral_T, &error);
if(res)
{
throw "Error intgrating";
}
int res = gsl_integration_qags(&F, T, 1e+14, 0, 1e-7, 10000, w, &integral_t, &error);
if(res)
{
throw "Error intgrating";
}
return integral_T/integral_t;
}
mais je reçu le message d'erreur suivant:
/home/ga/svn/PhD/inflation/cpp/ioi/bondpricecalculator.cpp:20: error: cannot convert ‘boost::_bi::bind_t<double, double (*)(double, double, double, void*), boost::_bi::list4<boost::_bi::value<double>, boost::_bi::value<double>, boost::arg<1>, boost::arg<2> > >*’ to ‘double (*)(double, void*)’ in assignment
Pour que votre code fonctionne, la fonction F. doit avoir la signature double nomfonction (double, vide *). – Patrick