c++ - 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
指针并通过它调用成员函数。
推荐阅读
- python - 使用 TextBlob 到 csv 的列表索引超出范围错误
- docker - 无法连接到 docker 私有注册表“getsockopt:没有到主机的路由”
- python - 将嵌套列表中的特定组件从字符串更改为浮点数
- java - 使用 RabbitMQ 在消费者回调中发布到队列
- c++ - 来自变量的 QJsonObject 部分路径
- android - 在约束布局中以编程方式设置 TextView 的重力
- java - 即使在将 int 转换为 String 之后,Java 流也会给出“无与伦比的类型:int 和 String”
- ios - UICollectionView .reloadData() 只显示部分
- html - 如何使用 css 向自定义收音机添加刻度?
- java - 附加到 Java 中的链表