Vì vậy, tôi đang cố gắng viết một hàm Tích hợp được sử dụng với C++ 11 lambdas. Mã này trông giống như sau:C con trỏ hàm với 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});
}
Đang cố gắng để biên dịch này, trình biên dịch nói:
error: cannot convert ‘std::function<double(double, void*)>’ to ‘double (*)(double, void*)’ in assignment
về dòng
F.function =func;
Nhưng nếu tôi viết:
F.function =[](double a,void* param)
{
return ((std::vector<double> *)param)->at(0)*a+((std::vector<double> *)param)->at(1);
};
Nó biên dịch và hoạt động tốt. Làm thế nào tôi nên giải quyết điều này?
Bạn có cần tính linh hoạt của 'std :: function' không? Bạn có thể thay đổi tham số đầu tiên của 'Integerate' thành một con trỏ hàm? Bởi vì không có cách nào bạn sẽ có thể sử dụng một 'std :: function' như là một con trỏ hàm, trừ khi bạn nhận được vào một số kinh doanh biến toàn cầu rất xấu xí. Lưu ý rằng bạn có thể lưu trữ một lambda trong một con trỏ hàm, miễn là nó không nắm bắt, trong đó, trong ví dụ bạn đã cho thấy, nó không có. –
Có câu trả lời của bạn, trong câu cuối cùng của bình luận đầu tiên. –
Trên thực tế không cần cho globals, kể từ khi giao diện C bao gồm một tham số 'void *' được thông qua. – aschepler