Twitter iPhone pliant OnePlus 12 PS5 Disney+ Orange Livebox Windows 11 ChatGPT

Appel de fonction par nom / string

3 réponses
Avatar
Thierry
Bonjour,

Je suis en train de develloper une sorte de handler SOAP, qui parse
des requete XML et repond en fonction de la methode invoqu=E9e.

Il y a une cinquantaine de m=E9thode et je veux pouvoir invoquer la
bonne m=E9thode sans faire 50 if (methodName =3D=3D "GetTruc") { return
GetTruc(); }

Toutes les fonctions ont le m=EAme proto int GetTruc();

Une m=E9thode serait de faire une map<string nom de fonction, pointeur
sur la fonction fonction> mais =E7a oblige d'avoir des m=E9thodes
statiques et de passer une reference a this dans chacune d'elle.
Pas satisfaisait a mon gout.

Une m=E9thode deriv=E9e serait de creer une classe friend qui exporte les
fonctions statiques avec un pointeur this en parameter et qui ferait
l'appel a la fonction.

Y'aurrait pas un moyen sioux pour appeller une m=E9thode "par son" nom
et en passant le this je ne sais pas comment ? J'ai regard=E9 du cot=E9 de
boost::bind sans trouver de solutions.

3 réponses

Avatar
Pascal J. Bourguignon
Thierry writes:


Y'aurrait pas un moyen sioux pour appeller une méthode "par son" nom
et en passant le this je ne sais pas comment ? J'ai regardé du coté de
boost::bind sans trouver de solutions.



this->call("nomDeMethode");

Autrement dit, non, pas vraiment.

--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Alain Ketterlin
Thierry writes:

Je suis en train de develloper une sorte de handler SOAP, qui parse
des requete XML et repond en fonction de la methode invoquée.

Il y a une cinquantaine de méthode et je veux pouvoir invoquer la
bonne méthode sans faire 50 if (methodName == "GetTruc") { return
GetTruc(); }

Toutes les fonctions ont le même proto int GetTruc();

Une méthode serait de faire une map<string nom de fonction, pointeur
sur la fonction fonction> mais ça oblige d'avoir des méthodes
statiques et de passer une reference a this dans chacune d'elle.



Non ça n'oblige pas à faire des méthodes statiques, mais la syntaxe est
un peu lourde.

class X {
public:
int f() { return 0; }
int g() { return 1; }
};

void call(X & x, int (X::*member)())
{
(x.*member)();
}
int main()
{
X x;
call(x,&X::f);
}

Et tu peux donc utiliser une map pour la conversion nom -> pointeur vers
membre.

-- Alain.
Avatar
Thierry
On 19 sep, 13:49, Alain Ketterlin wrote:
Et tu peux donc utiliser une map pour la conversion nom -> pointeur vers
membre.



Ca marche, merci !