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).

questionAnswers(3)

yourAnswerToTheQuestion