J'essaie de créer une fonction qui prend un caractère, puis renvoie un pointeur sur une fonction en fonction de ce qu'était le personnage. Je ne sais juste pas comment faire pour qu'une fonction renvoie un pointeur sur une fonction.
#include <iostream>
using namespace std;
int f1() {
return 1;
}
int f2() {
return 2;
}
typedef int (*fptr)();
fptr f( char c ) {
if ( c == '1' ) {
return f1;
}
else {
return f2;
}
}
int main() {
char c = '1';
fptr fp = f( c );
cout << fp() << endl;
}
int f(char) {
return 0;
}
int (*return_f())(char) {
return f;
}
Non, sérieusement, utilisez un typedef :)
Créez un typedef pour la signature de fonction:
typedef void (* FuncSig)(int param);
Déclarez ensuite votre fonction comme renvoyant FuncSig:
FuncSig GetFunction();
En C++ 11, vous pouvez utiliser des types de retour de fin pour simplifier la syntaxe, par exemple en assumant une fonction:
int c(int d) { return d * 2; }
Cela peut être renvoyé par une fonction (qui prend un double pour montrer que):
int (*foo(double e))(int)
{
e;
return c;
}
En utilisant un type de retour de fin, cela devient un peu plus facile à lire:
auto foo2(double e) -> int(*)(int)
{
e;
return c;
}
Syntaxe de retour de la fonction:
return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters)
Par exemple: considérez la fonction qui doit être renvoyée comme suit,
void* (iNeedToBeReturend)(double iNeedToBeReturend_par)
{
}
La fonction iNeedToBeReturend peut maintenant être renvoyée sous la forme
void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double)
{
return iNeedToBeReturend;
}
Je me sentais très mal d'apprendre ce concept après 3 ans de vie en programmation professionnelle.
Bonus pour vous en attente du pointeur de la fonction de déréférencement.
Exemple de fonction qui retourne le pointeur de fonction est dlopen dans la bibliothèque dynamique en c ++
Voici comment le faire sans utiliser de typedef:
int c(){ return 0; }
int (* foo (void))(){ //compiles
return c;
}
typedef void (*voidFn)();
void foo()
{
}
voidFn goo(char c)
{
if (c == 'f') {
return foo;
}
else {
//..
}
// ..
}
Consultez ce site - http://cdecl.org
Vous aide à convertir l'anglais en déclarations C et inversement!
Truc cool!
Ce lien décode l'exemple dans la réponse d'erikallen. int (* return_f ()) (char)
C'est le code pour afficher le retour d'un pointeur de fonction. Vous devez définir la "signature de fonction" pour retourner en premier:
int returnsOne() {
return 1;
}
typedef int(*fp)();
fp returnsFPtoReturnsOne() {
&returnsOne;
}
Dans votre cas spécifique:
fp getFunctionFor(char code) {
switch (code) {
case 'a': return &functionA;
case 'b': return &functionB;
}
return NULL;
}
En supposant que int f(char)
et ret_f
qui renvoie &f
.
Manières compatibles C++ 98/C++ 03:
Laid:
int (*ret_f()) (char) { return &f; }
Avec typedef
typedef int (sig) (char);
sig * ret_f () {return & f; }
ou
typedef int (*sig_ptr)(char);
sig_ptr ret_f() { return &f; }
Depuis C++ 11, nous avons en outre:
type de retour arrière:
auto ret_f() -> int(*)(char) { return &f; }
ou
auto ret_f() -> decltype(&f) { return &f; }
typedef
avec using
:
using sig = int(char);
sig* ret_f() { return &f; }
ou
using sig_ptr = int (*)(char);
sig_ptr ret_f() { return &f; }
C++ 14 ajoute:
auto
déduction:
auto ret_f() { return &f; }
Le moyen le plus simple consiste à saisir le type de pointeur vers la fonction que vous souhaitez, puis à l'utiliser
typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....
Je préfère renvoyer des objets et appeler l'opérateur (). De cette façon, votre fonction peut retourner une interface et toutes les classes peuvent en hériter. Autrement dit, si vous utilisez C++ et non C.
Ensuite, vous pouvez utiliser la méthode du facteur paramétré pour renvoyer les objets en fonction de votre entrée.
Quelque chose comme ça
#include <iostream>
typedef char (*fn_ptr_t)(char);
char a_fn(char c)
{
return c + 1;
}
char b_fn(char c)
{
return c + 2;
}
fn_ptr_t
return_function(char c)
{
fn_ptr_t result = 0;
switch (c)
{
case 'a':
result = a_fn;
break;
case 'b':
result = b_fn;
break;
}
return result;
}
int
main()
{
fn_ptr_t fn = return_function('a');
std::cout << "a(l) = " << (fn)('l') << std::endl;
return 0;
}