Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何使接受类函数作为参数的函数重载_C++ - Fatal编程技术网

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

C++ C++;如何使接受类函数作为参数的函数重载,c++,C++,我使用ALGLIB来运行给定函数的LBFGS最小化。为此,我需要使用以下语句: alglib::minlbfgsoptimize(state, FunctionToOptimizeHere) 以下是alglib包中提供的alglib::minlbfgsoptimize的一个声明: void minlbfgsoptimize(minlbfgsstate &state, void (*grad)(const real_1d_array &x, double &func, r

我使用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, ...);
  }
};

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

如果类内函数被调用
void Foo::frobnite()
然后在名为
void thunkfooforobnite(Foo*Foo){Foo->frobnite();}
的类外创建一个独立的thunking函数,并将
thunkfoorobnite
函数传递到中。我以前从未见过,这很酷。我现在一定要试试!工作得很有魅力。非常感谢你!
MyClass myObject;
alglib::minlbfgsoptimize(state, MyClass::Trampoline, nullptr, &myObject);