Próbuję więc napisać funkcję integracji, która będzie używana z lambdami C++ 11. Kod wygląda mniej więcej tak:Wskaźniki funkcyjne z C++ 11 lambdas
double Integrate(std::function<double(double,void*)> func, double a,double b,std::vector<double> & params)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
gsl_function F;
F.function =func;
F.params = (void*)¶ms;
double error,result;
gsl_integration_qag (&F, a, b, 0, 1e-7, 1000,GSL_INTEG_GAUSS61,w, &result, &error);
gsl_integration_workspace_free (w);
return result;
}
void Another_function()
{
//...
Integrate([](double a,void* param)
{
return ((vector<double> *)params)->at(0)*a+((vector<double> *)params)->at(1);
}
,0,3,{2,3});
}
Próba skompilować tego, kompilator mówi:
error: cannot convert ‘std::function<double(double, void*)>’ to ‘double (*)(double, void*)’ in assignment
o linię
F.function =func;
Ale jeśli piszę:
F.function =[](double a,void* param)
{
return ((std::vector<double> *)param)->at(0)*a+((std::vector<double> *)param)->at(1);
};
Kompiluje i działa dobrze. Jak mam to rozwiązać?
Potrzebujesz wszechstronności 'std :: function'? Czy mógłbyś zmienić pierwszy parametr 'Integerate' jako wskaźnik funkcji? Ponieważ nie ma możliwości użycia funkcji 'std :: function' jako wskaźnika funkcji, chyba że dostaniesz się do jakiejś bardzo brzydkiej biznesowej zmiennej globalnej. Zauważ, że możesz przechowywać lambdę w wskaźniku funkcji, o ile nie przechwytuje, co w przykładzie, który pokazałeś, nie zawiera. –
Oto twoja odpowiedź, w ostatnim zdaniu pierwszego komentarza. –
W rzeczywistości nie ma potrzeby globali, ponieważ interfejs C zawiera parametr "void *", który ma zostać przekazany. – aschepler