J'ai récemment trébuché sur cette pensée curieuse tout en manipulant un code C.
J'ai écrit une fonction qui renvoie un double et prend en comme argument le pointeur sur une fonction et un certain nombre de paramètres, à savoirEst-il possible d'écrire une fonction qui retourne un pointeur vers une fonction différente de la fonction dans son argument?
double template_1(double (*)(double),...);
cette fonction identifie correctement une propriété d'une fonction réelle
double f(double);
représenté comme un pointeur dans template_1
, afin de rendre template_1
valide pour chaque fonction réelle que je pourrais brancher.
Maintenant, je devais écrire une autre fonction, que ce soit:
double derivative(double (*)(double),double);
double derivative(double (*f)(double),double x){
double epsilon = ...;
return (f(x+epsilon)-f(x-epsilon))/(2.0*epsilon);
}
à nouveau avec f dans l'argument pour le faire fonctionner pour chaque f. Ma question est: puisque je voudrais utiliser derivative
dans template_1
sans le modifier, est-il possible d'écrire une fonction qui prend dérivé et recrache quelque chose qui a la forme de double (*)(double)
?
Mon idée était de définir typedef double (*real_function)(double);
puis de définir
real_function g(double (*derivative)(double (*)(double),double))
que je voudrais à cracher quelque chose comme: double derivative_2(double x)
; de sorte que je pourrais définir quelque chose comme g(derivative) = double (*h)(double);
directement dans template_1 argument
malheureusement, je n'ai pas la moindre idée de la façon de faire ce travail, ou même si cela peut fonctionner.
Cela ne serait possible que dans le cas où cette fonction retournée est déjà définie. Non, vous ne pouvez pas "définir" des fonctions dans le runtime. Vous devrez passer à un langage fonctionnel tel que Haskell ou Lisp pour cela. –
Il n'y a pas de moyen (portable) de créer une fonction à l'exécution en C. –
@EugeneSh. la plupart des langues, et pas seulement les langues fonctionnelles, le supportent (au moins sous une forme quelconque) - par exemple C++, java, go. –