我已经看到过这个问题的不同风格,但它并没有真正解决我的问题。情况是这样的,我想使用一个库,但是其中一个函数非常复杂,需要一个
void(*func)(std::vector<double> &x,double& func,void* ptr)
作为输入。
我有一个类,保存了所有关键数据成员,自然外部库需要的函数必须是成员函数。据我了解,这是不可能的。绕过该要求的技巧是什么?
通常,我使用
std::function
和 std::bind
但我不认为有办法将 std::function 转换为 void *
,并且我再次无法更改外部库。使用静态函数使我无法访问关键数据成员。
库函数的签名是
void minlbfgsoptimize(minlbfgsstate &state,void (*func)(const real_1d_array &x, double &func, void *ptr), void (*rep)(const real_1d_array &x, double func, void *ptr) = NULL, void *ptr = NULL);
完整代码位于https://github.com/hjkuijf/ALGLIB/blob/master/src/optimization.h
这是一个 C 风格的回调。该 void ptr 将传递您提供的一些指针。
你的工作是让该 ptr 具有你需要的状态。
在您的情况下,它可以是指向您的类的指针。
struct Foo {
static void callback(std::vector<double> &x,double& f,void* ptr){
return static_cast<Foo*>(ptr)->callback_impl(x, f);
}
void callback_impl(std::vector<double>& x, double&f);
};
现在当称你为绿洲
this
为ptr
时:
minlbfgsoptimize(state,Foo::callback, nullptr, this);
其中
this
是 Foo*
。
静态成员函数只是函数。只要输入和输出类型完全匹配,指针就可以通过
void*
进行往返。