c++ - 指向成员函数的函数指针

标签 c++ function-pointers pointer-to-member nlopt

我想使用一个库 (nlopt),它有一个函数 set_min_objective,它接受一个指向数值函数 myfunc 的指针并找到它的最小值。我想创建一个包含适当初始化的成员函数的类。然后 set_min_objective 会在特定实例中找到最优值(下例中的 myP)。调用顺序为:

opt.set_min_objective(myfunc, NULL);

我想使用类似的东西:

opt.set_min_objective(myP.f, NULL);

编译时我得到的错误是:

main.cpp: In function 'int main()':
main.cpp:79:34: error: no matching function for call to 'nlopt::opt::set_min_objective(<unresolved overloaded function type>, NULL)'
../lib/nlopt.hpp:335:10: note: candidates are: void nlopt::opt::set_min_objective(double (*)(unsigned int, const double*, double*, void*), void*)
../lib/nlopt.hpp:342:10: note:                 void nlopt::opt::set_min_objective(double (*)(const std::vector<double>&, std::vector<double>&, void*), void*)
../lib/nlopt.hpp:368:10: note:                 void nlopt::opt::set_min_objective(double (*)(unsigned int, const double*, double*, void*), void*, void* (*)(void*), void* (*)(void*))

让 set_min_objective 接受 myP.f 作为指向函数的普通指针的最简单解决方案是什么?请注意,myP.f 和 myfunc 具有相同的参数和返回值类型。

谢谢,

京东

最佳答案

您不能直接这样做。您正在尝试将指向成员函数的指针作为指向函数的指针传递。方法是编写一个包装函数(一个普通函数),例如,将计算委托(delegate)给您的对象的成员函数,例如,一个全局对象。

编辑

实际上,您很幸运:opt.set_min_objective 的第二个参数是指向您的数据的指针,该数据将被传递给您将指针作为第一个参数传递给的函数。这意味着您的包装函数不必使用全局对象。

class YourClass
{
public:
    double f(unsigned int i, const double*, double*, void*);
};

double wrapper(unsigned int i, const double* a, double* b, void* o) {
    // not sure what you'd need the last param for, but you say you have it...
    reinterpet_cast<YourClass*>(o)->f(i, a, b, o);
}

然后:

YourClass myP;
opt.set_min_objective(wrapper, &myP);

另一个编辑。在你之前有人遇到过类似的问题:http://www.cplusplus.com/forum/general/73166/

关于c++ - 指向成员函数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377344/

相关文章:

c++ - 如何在for循环中用多个字符组成一个字符串

Delphi:使用指针函数

c++ - 如何将重载的成员函数作为参数传递?

c++ - 指向函数成员和非成员的指针

c++ - 具有方法指针参数默认值的模板

c++ - C++ 中的私有(private)类属性

c++ - 如何将值从std :optional without calling the destructor?中移出

c++ - 为什么这段 C++ 代码会产生段错误?

c - C中函数指针在数据结构开发中的使用

c++ - 将 `std::sort` 与模板类中的成员函数一起使用