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

标签 c++ c++11 casting gsl

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

,它把错误还给了我

type name requires a specifier or qualifier

最佳答案

std::function 是一种从标准库中删除“general functor”的类型。它不能隐式转换为常规函数指针,您也不应该尝试这样做,因为您最终只会搬起石头砸自己的脚。您需要使用符合 gsl_function::function typedef 的适当常规函数来包装对 func 的调用。

gsl_function::function 接受一个 void* 作为额外的函数参数。这是将 std::function 之类的对象传递给它的 Hook ,以方便调用。您可以使用无捕获的 lambda(它将隐式转换为自由函数指针)以保持本地化:

gsl_function F = {
  [](double d, void* vf) -> double {
    auto& f = *static_cast<std::function<double(double)>*>(vf);
    return f(d);
  },
  &func
};

关于C++:将 std::function 转换为 gsl_function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48606711/

相关文章:

c++ - std::move() 或其在局部变量上的显式等效项是否允许省略?

angular - 如何在 Angular 2+ 中将 md ElementRef 转换为 HtmlElement

来自字符串的 C++ 字节数组

c++ - wxWidgets 和锁定资源

c++ - decltype 返回的模板推导/替换错误

c++ - dynamic_pointer_cast 的模板参数

Java - 摆脱编译器警告?

c++ - '<function-style-cast >' : cannot convert from ' int' to 'CString'

C++检查回文时如何忽略上下的区别?

c++ - Boost.MultiIndex 数据结构中的通配符搜索?