C ++如何制作接受类函数作为参数的函数重载

埃洛伊商标

我正在使用 ALGLIB 来运行给定函数的 LBFGS 最小化。为此,我需要使用以下语句:

alglib::minlbfgsoptimize(state, FunctionToOptimizeHere)

这是 ALGLIB 包中提供的 alglib::minlbfgsoptimize 的一个声明:

void minlbfgsoptimize(minlbfgsstate &state,
void (*grad)(const real_1d_array &x, double &func, real_1d_array &grad, void *ptr),
void  (*rep)(const real_1d_array &x, double func, void *ptr) = NULL,
void *ptr = NULL,
const xparams _xparams = alglib::xdefault);

所以当我在任何类之外创建我的函数时

void function(const alglib::real_1d_array& x, double& func, alglib::real_1d_array& grad, void* ptr)

它工作正常,但问题是我需要在它不起作用的类中的函数上使用它。参数不匹配,因为我的函数现在是:

void MyClass::Myfunction(const alglib::real_1d_array& x, double& func, alglib::real_1d_array& grad, void* ptr)

我无法弄清楚如何重载 minlbfgsoptimize 以接受我的(在类内)函数。有人可以帮我吗?谢谢

伊戈尔垃圾桶

幸运的是,您的库提供了一种将上下文传递给回调的方法。您需要一个中间非成员或静态成员函数(有时称为“蹦床”)。沿着这些路线的东西:

class MyClass {
  void DoActualWork(const alglib::real_1d_array& x, ...);
  static void Trampoline(const alglib::real_1d_array& x, ..., void* ptr) {
    static_cast<MyClass*>(ptr)->DoActualWork(x, ...);
  }
};

然后你会这样称呼它:

MyClass myObject;
alglib::minlbfgsoptimize(state, MyClass::Trampoline, nullptr, &myObject);

请注意如何将MyClass指针传递给minlbfgsoptimize, 在void* ptr参数中。然后库将其转发给回调,回调恢复原始MyClass指针并通过它调用成员函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++重载函数作为模板参数

以结构继承作为参数重载函数C ++

C ++如何在原始抽象类中制作一个函数,该函数接受派生类的输入

如何接受带有任意数量参数的函数的指针(作为C中的参数)并调用它?

c ++类对象作为函数参数

c ++类方法指针作为函数参数

模板类作为函数参数 [C++]

C ++绑定重载成员函数并作为参数传递

如何调用一个Objective-C函数,它接受Swift的块字典作为参数?

如何使用使用参数包和类型名的类作为函数的输入参数(C ++)

如何在C中将函数作为参数?

C++:将引用作为参数传递,但该函数不接受引用作为参数

如何重载具有多个参数的函数?C ++

以可变参数作为函数C ++的参数的函数

如何使用模板类型作为函数参数派生抽象模板类(C ++ 11)

一些C函数如何接受空参数?

标准c函数在汇编中如何接受参数?

将Cython类对象作为参数传递给C函数

在C ++中使用抽象类作为函数的参数

C ++将临时类型名类作为函数参数传递

c ++ std::vector 作为类方法的参数传递的函数

C++ 类作为函数的参数不起作用

将类类型作为构造函数参数传递 C++

如何在 C++ 中创建一个接受大括号中的参数的类构造函数?

如果只有C ++中的基类指针,则使用派生类参数重载函数

C#函数作为参数

如果传递的函数也将函数作为参数,如何将函数作为参数传递给C中的函数?

如何在C ++中创建一个函数原型,该函数原型接受两个整数作为参数并返回它们的差值?

如何重载作为参数传递给C ++中的模板类的基类方法?