Kno*_*dge 3 c++ casting gsl c++11
我想使用GNU科学库,需要转换std::function为gsl_function,类型为double (* function) (double x, void * params)。
到目前为止,我只是尝试过:
class Numerics {
public:
....
double integrate(function<double(double)> &func) {
double result, error;
gsl_function F;
F.function = static_cast<(*)(double, void *)>( func );
gsl_integration_qag(&F, 0, 1, epsabs_, epsrel_, 1000, 6, w_, &result, &error);
return result;
}
...
};
Run Code Online (Sandbox Code Playgroud)
,这使我退回错误
类型名称需要指定符或限定符
std::function是标准库中用于擦除“通用函子”持有人的类型。它不是可以隐式转换为常规函数指针,也不应该尝试这样做,因为您最终只能用脚射击。您需要func使用符合gsl_function::functiontypedef 的适当常规函数来包装对的调用。
gsl_function::function接受一个void*额外的功能参数。这就是将类似的对象传递std::function到其中以方便调用的钩子。您可以使用无捕获的lambda(它将隐式转换为自由函数指针)以使内容保持局部:
gsl_function F = {
[](double d, void* vf) -> double {
auto& f = *static_cast<std::function<double(double)>*>(vf);
return f(d);
},
&func
};
Run Code Online (Sandbox Code Playgroud)