成员函数指针

3

我希望使用一个名为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具有相同的参数和返回值类型。

谢谢,

JD

1个回答

5
你不能直接这样做。你试图将指向成员函数的指针作为指向函数的指针传递。正确的做法是编写一个包装函数(普通函数),例如将计算委托给对象的成员函数,该对象是全局对象。
编辑:
实际上,你很幸运: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/


你好,感谢你的回答,它有效了。我必须使用:reinterpet_cast(o)->f(i, a, b);因为我不想将对象传递给自身。 - vkubicki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接