Quindi sto provando a scrivere una funzione di integrazione da utilizzare con lambda C++ 11. Il codice simile a questa:C point pointer con C++ 11 lambda
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});
}
Cercando di compilare questo, compilatore dice:
error: cannot convert ‘std::function<double(double, void*)>’ to ‘double (*)(double, void*)’ in assignment
sulla linea
F.function =func;
Ma se scrivo:
F.function =[](double a,void* param)
{
return ((std::vector<double> *)param)->at(0)*a+((std::vector<double> *)param)->at(1);
};
Compila e funziona bene. Come dovrei risolvere questo?
Avete bisogno della versatilità di 'std :: function'? Potresti cambiare il primo parametro di "Integerate" come puntatore a funzione? Perché non c'è modo che tu possa usare una 'std :: function' come puntatore a funzione, a meno che tu non entri in qualche business delle variabili globali molto brutto. Si noti che è possibile memorizzare un lambda in un puntatore a funzione, purché non catturi, il che, nell'esempio che hai mostrato, non lo fa. –
C'è la tua risposta, nella frase finale del primo commento. –
In realtà non c'è bisogno di globals, poiché l'interfaccia C include un parametro 'void *' da passare. – aschepler