C++ 指向成员函数的函数指针

C++ 指向成员函数的函数指针,c++,function-pointers,member-function-pointers,nlopt,C++,Function Pointers,Member Function Pointers,Nlopt,我想使用一个库(nlopt),它有一个函数集_min _objective,它接受一个指向数值函数myfunc的指针并找到它的最小值。我想创建一个包含适当初始化的成员函数的类。然后,set_min_objective将在特定实例中找到一个最优值(下例中为myP)。调用顺序为: opt.set_min_objective(myfunc, NULL); 我想用这样的方法: opt.set_min_objective(myP.f, NULL); 编译此文件时出现的错误是: main.cpp: In

我想使用一个库(nlopt),它有一个函数集_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*))
main.cpp:在函数“int main()”中:
main.cpp:79:34:错误:调用“nlopt::opt::set_min_objective(,NULL)”时没有匹配函数
../lib/nlopt.hpp:335:10:注:候选项为:void nlopt::opt::set_min_objective(double(*)(无符号整数,常量双精度*,双精度*,双精度*),void*)
../lib/nlopt.hpp:342:10:注意:void nlopt::opt::set_min_objective(双(*)(常量std::vector&,std::vector&,void*),void*)
../lib/nlopt.hpp:368:10:note:void nlopt::opt::set_min_objective(double(*)(无符号整数,常数double*,double*,void*),void*,void*(*)(void*),void*(*)(void*)(void*)
要将myP.f设置为函数的普通指针,最简单的解决方案是什么?请注意,myP.f和myfunc具有相同的参数和返回值类型

谢谢,


JD

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

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);
}
编辑

实际上,您很幸运:
opt.set\u min\u 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);
}

另一次编辑。其他人在您之前也遇到过类似的问题:

您好,谢谢您的回答,它很有效,我必须使用:reinterpet_cast(o)->f(I,a,b);因为我不想把物体传给它自己。