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
Version imprimable
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.
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...
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:
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; }
Médinoc> Ha oui effectivement, ça m'a l'air pratique comme solution :D
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... :oops:
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 :D
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...
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.Citation:
Envoyé par Ekinoks
Non car la fonction a besoin de l'adresse de cet argument pour déterminer l'adresse des arguments suivants.Citation:
ou alors on peu pas se passer d'au moins 1 premier argument "normal" ?