그래서 나는 C++ 11 lambdas 함께 사용할 수있는 통합 함수를 작성하려고합니다.C++ 11 람다와 C 함수 포인터
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});
}
이 컴파일 시도, 컴파일러는 말한다 : 코드는 다음과 같이 보입니다 라인에 대한
error: cannot convert ‘std::function<double(double, void*)>’ to ‘double (*)(double, void*)’ in assignment
F.function =func;
하지만 작성하는 경우 :
F.function =[](double a,void* param)
{
return ((std::vector<double> *)param)->at(0)*a+((std::vector<double> *)param)->at(1);
};
그것을 컴파일하고 잘 작동합니다. 어떻게 해결해야합니까?
'std :: function'의 다 기능성이 필요합니까? 'Integerate'의 첫 번째 매개 변수를 함수 포인터로 바꿀 수 있습니까? 왜냐하면 당신이 아주 못생긴 전역 변수 비지니스에 들어 가지 않는 한,'std :: function'을 함수 포인터로 사용할 수있는 방법이 없기 때문입니다. 람다는 포착하지 않는 한 함수 포인터에 저장할 수 있습니다. 예를 들어 보여준 예에서는 포착 할 수 없습니다. –
첫 번째 의견의 마지막 문장에 답변이 있습니다. –
사실, C 인터페이스는 전달 될'void *'매개 변수를 포함하기 때문에 전역 변수가 필요 없습니다. – aschepler