C ++:将std :: function转换为gsl_function

Kno*_*dge 3 c++ casting gsl c++11

我想使用GNU科学库,需要转换std::functiongsl_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)

,这使我退回错误

类型名称需要指定符或限定符

Sto*_*ica 5

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)