Salut !
J’aimerais savoir s’il est possible de définir un pointeur qui pointe une fonction quelle conque …
Du genre que le pointeur puisse aussi bien pointer une fonction du style : int A(int a) que void B(void)
Es possible ?
Merci
Salut !
J’aimerais savoir s’il est possible de définir un pointeur qui pointe une fonction quelle conque …
Du genre que le pointeur puisse aussi bien pointer une fonction du style : int A(int a) que void B(void)
Es possible ?
Merci
Oui mais pour l'appeler tu auras besoin de connaître sa vraie signature.
Sur une fonction totalement quelconque, non (du moins pas en C++, certaines extentions le permettent, comme par exemple visual C++ qui considère qu'un void* peut stocker un pointeur vers tout et n'importe quoi, et utilise entre autre ça dans les chargement dynamiques de bibliothèques).
Plus flexible que les pointeurs de fonction, genre qui accepte int f() quand on a besoin de void f(), il y a boost::function qui te permet de faire ça. Je ne sais pas comment ils gèrent en interne.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Merci pour vos réponses =)
loufoque> ha oui c'est vrais j'y avez pas pensé :^/
JolyLoic> ok... je croie que je vais plutôt essayer de trouver une autre solution ^^
Encore Merci
Tu peux toujours faire un pointeur de fonction acceptant une va_list...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
en combinant template and objet function, on pourrait pas approcher ce que tu veux ?
Médinoc> ouais j'y est pensé mais après c'est galère de se trimbaler avec des fonction va_list... :^/
epsilon68> ha ? je vais essayer de me renseigner sur qu'es que c'est les template
Merci
Le mieux, je trouve, c'est une fonction va_list et un wrapper en "..."
Ainsi, tu peux utiliser les va_list là où c'est approprié (partout où c'est dynamique, notamment) et garder les raccourcis pour un appel normal...
Code C extrait d'un header perso : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 int DebugMessageBoxV( HWND hWnd, LPCTSTR sczFormatTexte, LPCTSTR sczTitre, va_list vlArgs ); static inline int DebugMessageBox( HWND hWnd, LPCTSTR sczFormatTexte, LPCTSTR sczTitre, ... ) { int iRetour = 0; va_list vlArgs; va_start(vlArgs, sczTitre); iRetour = DebugMessageBoxV(hWnd, sczFormatTexte, sczTitre, vlArgs); va_end(vlArgs); return iRetour; }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Médinoc> Ha oui effectivement, ça m'a l'air pratique comme solution![]()
Je vais essayer ça, Merci =)
En fait, c'est ainsi que devraient être faites toutes les fonctions acceptant "...", car seule la forme en va_list peut être appelée depuis un wrapper.
Par exemple, ma fonction DebugMessageBoxV() appelle vprintf() (enfin, une de ses fonctions soeurs) et lui passe sa va_list. vprintf() aurait pu être appelée depuis n'importe laquelle des deux fonctions, alors que printf() n'aurait pu être appelée d'aucune.
PS: En fait, c'est l'unique façon dont j'utilise les va_list. Je n'ai même pas encore fait de fonction qui lise effectivement le contenu de la va_list...![]()
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
ouaip, c'est pas faux... j'aurais jamais penser a définir ma fonction avec un va_list plutôt qu'avec des "..." ^^
dorénavant je ne ferais plus que ça aussi![]()
par contre il y a un truc que je me suis toujours demandé... es possible de définir une fonction avec juste un wrapper du genre : void fonction(...);
pour quelle puisse recevoir 0 argument ? ou alors on peu pas se passer d'au moins 1 premier argument "normal" ?
Ca, je l'ignore.
Mais je pense que non, car cela exigerait une syntaxe qui m'est inconnue (ou un hack affreux) pour accéder aux paramètres...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
ok, on va rester dans une utilisation classique alors ^^
Merci beaucoup pour ton aide !
T'as qu'a juste définir des fonctions qui prennent en argument une liste.Envoyé par Ekinoks
Non car la fonction a besoin de l'adresse de cet argument pour déterminer l'adresse des arguments suivants.ou alors on peu pas se passer d'au moins 1 premier argument "normal" ?
Partager