3

数値関数 myfunc へのポインタを取り、その最小値を見つける関数 set_min_objective を持つライブラリ (nlopt) を使用したいと考えています。適切に初期化されたメンバー関数を含むクラスを作成したいと思います。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 を function への通常のポインタとして受け入れるようにする最も簡単な解決策は何でしょうか? myP.f と myfunc の引数と戻り値の型は同じであることに注意してください。

ありがとうございました、

JD

4

1 に答える 1

5

それを直接行うことはできません。メンバー関数へのポインターを関数へのポインターとして渡そうとしています。行く方法は、たとえば、グローバルオブジェクトなどのオブジェクトのメンバー関数に計算を委譲するラッパー関数 (通常の関数) を作成することです。

編集

実際には、あなたは幸運です: への 2 番目のパラメーター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/

于 2012-09-11T20:38:12.967 に答える