Указатель на функцию-функцию

Я хочу использовать библиотеку (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

3

Решение

Вы не можете сделать это напрямую. Вы пытаетесь передать указатель на функцию-член как указатель на функцию. Для этого нужно написать функцию-обертку (обычную функцию), которая, например, делегирует вычисление функции-члену вашего объекта, который является, например, глобальным объектом.

РЕДАКТИРОВАТЬ

На самом деле вам повезло: второй параметр 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/

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]