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

时间:2018-02-04 09:39:36

标签: c++ c++11 casting gsl

我想使用GNU Scientific Library并需要将std::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; } ... };

到目前为止,我只是尝试过:

    import jira.client
    from jira.client import JIRA

,它将错误交给我

  

类型名称需要说明符         或限定词

1 个答案:

答案 0 :(得分:4)

std::function是一种从标准库中删除“普通仿函数”的类型。它不是可以隐式转换为常规函数指针,也不应该尝试这样做,因为你最终只能用脚射击自己。您需要使用符合func typedef的正确常规函数将调用包装到gsl_function::function

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
};