C++:将 std::function 转换为 gsl_function
C++: Cast std::function to gsl_function
我想使用类型为 double (* function) (double x, void * params)
的 GNU Scientific Library and need to cast std::function
to the gsl_function。
到目前为止,我只是尝试过:
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
之类的对象传递给它的挂钩,以方便调用。您可以使用无捕获的 lambda(它将隐式转换为自由函数指针)以保持本地化:
gsl_function F = {
[](double d, void* vf) -> double {
auto& f = *static_cast<std::function<double(double)>*>(vf);
return f(d);
},
&func
};
我想使用类型为 double (* function) (double x, void * params)
的 GNU Scientific Library and need to cast std::function
to the gsl_function。
到目前为止,我只是尝试过:
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
之类的对象传递给它的挂钩,以方便调用。您可以使用无捕获的 lambda(它将隐式转换为自由函数指针)以保持本地化:
gsl_function F = {
[](double d, void* vf) -> double {
auto& f = *static_cast<std::function<double(double)>*>(vf);
return f(d);
},
&func
};