C++ nom de fonction a appeler dans un string

gfitas -  
 techno01 -
Bonjour,
J'aimerais pouvoir faire en sorte que l'utilisateur entre un mot et que celui ci sois stocker dans une variable de type string et qu'ensuite la valeur string link sur une fonction. Par exemple (je sais que ca marche pas mais c'est pour donner l'idee) :
void azerty();
void az();
void ae();
cout<<"Fonction :";
string fct;
cin>>fct;
try
{
fct();
}
catch(...)
{
}

Ca marcherait dans le cas seulement ou biensur fct serait egal a azerty ou a az ou a ae ....
Merci d'avance(je suis sous visual studio c++ mais peux aussi etre sous c++ builder)

2 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
La seule solution que je vois, c'est de faire explicitement une table de correspondance, éventuellement avec des pointeurs de fonction.
Il faut bien voir que le nom d'une fonction n'est que temporaire et n'a plus sa place dans un programme compilé. En effet, après compilation l'appel à une fonction se résume (en gros) à l'appel d'une zone mémoire, un programme compilé a donc "oublié" de le nom de la fonction. Pour t'en convaincre, il suffit de faire une recherche dans l'exécutable après l'avoir "stripper". Or la valeur de fct n'est connu qu'à l'exécution (entrée par l'utilisateur) il n'est donc plus possible de faire le lien directement.

Voilà, j'espère être clair et que tu comprends le problème. Te reste à faire la table de correspondance.
0
gfitas
 
Bah le probleme de cette table c'est que dans le cas ou ma fonction contient des arguments alors cette table n'est plus possible
0
gfitas
 
Ah si je viens d'avoir un idée , 1 récupérer tout les cararctères jusqu'à la première parenthèse et ensuite stocker dans un string que tu compare a la table, ça a pas l'air trop con ^^
Merci de m'avoir éclaire une fois de plus
0
techno01
 
J ai pas totalement comprendre votre prob
mais je crois ce code va etre utile

# include <iostream>
# include <cstdio>
using namespace std;

void callFunc(int);
void func1(void);
void func2(void);
void func3(void);

int main()
{
/// On doit enter func1,func2 ou func3 pour invoquer les functions
string str;
cout << "Enter your string -> " ;cin >> str;
if(str.compare("func1")==0)callFunc(1);
else if(str.compare("func2")==0)callFunc(2);
else if(str.compare("func3")==0)callFunc(3);
else cout << "The index call is incorrect " << endl;
}

void callFunc(int indexCall)
{
switch(indexCall)
{
case 1:
func1();
break;
case 2:
func2();
break;
case 3:
func3();
break;
}
}

void func1(void)
{
cout << "I am func 1 " << endl;
}

void func2(void)
{
cout << "I am func 2 " << endl;
}

void func3(void)
{
cout << "I am func 3 " << endl;
}
0