Como eu poderia passar std :: function como ponteiro de função?
Estou tentando escrever um modelo de classe e, internamente, ele usa umC
função (implementação da otimização BFGS, fornecida peloR
ambiente) com a seguinte interface:
void vmmin(int n, double *x, double *Fmin,
optimfn fn, optimgr gr, ... ,
void *ex, ... );
Ondefn
egr
são indicadores de função do tipo
typedef double optimfn(int n, double *par, void *ex);
e
typedef void optimgr(int n, double *par, double *gr, void *ex);
respectivamente. MinhasC++
O modelo de classe fica assim:
template <typename T>
class optim {
public:
// ...
void minimize(T& func, arma::vec &dpar, void *ex) {
std::function<optimfn> fn =
std::bind(&T::fr, func, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3);
std::function<optimgr> gr =
std::bind(&T::grr, func, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3,
std::placeholders::_4);
// ERROR: cannot convert std::function to function pointer
vmmin(... , fn, gr, ...);
// ...
}
};
para que possa ser instanciado por qualquer classe com duas funções-membro especificadas, por exemplo:
class Rosen {
public:
// ...
double fr(int n, double *par, void *ex);
void grr(int n, double *par, double *gr, void *ex);
private:
// ...
};
// main.cc
Rosen func;
optim<Rosen> obj;
obj.minimize(func, dpar, ex);
Isso é possível? Ou talvez haja uma maneira melhor de fazer isso - passe as duas funções membro separadamente como ponteiro de função? (Se a função objetivo e o gradiente correspondente forem simples, não há problema em escrever duas funções. No entanto, na maioria das vezes, o problema que obtive é muito mais complicado e tenho que implementá-lo como uma classe).