私は、C++ 11ラムダで使用する統合関数を記述しようとしています。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