一个需要另一个函数作为参数的函数如何可以在c++的类中使用?

问题描述 投票:0回答:1

我已经看到过这个问题的不同风格,但它并没有真正解决我的问题。情况是这样的,我想使用一个库,但是其中一个函数非常复杂,需要一个

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++ function pointers std-function static-cast
1个回答
0
投票

这是一个 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*
进行往返。

© www.soinside.com 2019 - 2024. All rights reserved.