C++ C++;:将std::函数转换为gsl_函数

C++ C++;:将std::函数转换为gsl_函数,c++,c++11,casting,gsl,C++,C++11,Casting,Gsl,我想使用,需要将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_ca

我想使用,需要将
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;
  }
  ...
};
类数值{
公众:
....
双积分(函数和函数){
双重结果,错误;
gsl_函数F;
F.函数=static_cast(func);
gsl_积分_qag(&F,0,1,epsabs_,epsrel_,1000,6,w_,&result,&error);
返回结果;
}
...
};
,这就把错误还给了我

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


std::function
是一种从标准库中删除“通用函子”持有者的类型。它不能隐式地转换为常规函数指针,您也不应该尝试这样做,因为您最终会自食其果。您需要使用符合
gsl_function::function
typedef的适当常规函数包装对
func
的调用

gsl\u 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
};
gsl_函数F={
[](双d,无效*vf)->双d{
自动&f=*静态(vf);
返回f(d);
},
&func
};

您不能将
静态\u转换为
std::function
函数指针
std::function
可能包含比简单函数指针更多的信息。不能将
std::function
转换为函数指针。请看问题。可能与我要找的完全相同!非常详细的文字选择Thx!