Je m'explique : pour moi un callback c'est juste un pointeur de fonction
Je m'explique : pour moi un callback c'est juste un pointeur de fonction
Je m'explique : pour moi un callback c'est juste un pointeur de fonction
je me mets à Qt, et je suis actuellement sur leur mécanisme de
passage de messages (slots et signals). Dans la documentation en guise
d'intro il y a l'assertion :
"Callbacks have two fundamental flaws. Firstly they are not type
safe. We can never be certain that the processing function will call
the callback with the correct arguments."
Que je ne comprends pas. J'imagine qu'il s'agit encore d'une histoire
de compilation dynamique versus statique mais ça ne m'avance pas. Je
m'explique : pour moi un callback c'est juste un pointeur de fonction
(appelons le p) , et un pointeur de fonction est typé (on sait ce
qu'il renvoit et ce qu'il prend comme arguments). de meme, lorsque je
vais vouloir affubler une valeur à p, j'aurais le type de p et celui
de la fonction f vers laquelle je veux pointer... Donc moyen de
détecter s'il y a un problème de type... Enfin, lorsque je vais
utiliser p (donc f), j'ai le type de p (qui est celui de f) et donc
encore moyen de vérifier tous les types... Bref, je ne vois pas bien à
quel moment il peut y avoir un problème ?
je me mets à Qt, et je suis actuellement sur leur mécanisme de
passage de messages (slots et signals). Dans la documentation en guise
d'intro il y a l'assertion :
"Callbacks have two fundamental flaws. Firstly they are not type
safe. We can never be certain that the processing function will call
the callback with the correct arguments."
Que je ne comprends pas. J'imagine qu'il s'agit encore d'une histoire
de compilation dynamique versus statique mais ça ne m'avance pas. Je
m'explique : pour moi un callback c'est juste un pointeur de fonction
(appelons le p) , et un pointeur de fonction est typé (on sait ce
qu'il renvoit et ce qu'il prend comme arguments). de meme, lorsque je
vais vouloir affubler une valeur à p, j'aurais le type de p et celui
de la fonction f vers laquelle je veux pointer... Donc moyen de
détecter s'il y a un problème de type... Enfin, lorsque je vais
utiliser p (donc f), j'ai le type de p (qui est celui de f) et donc
encore moyen de vérifier tous les types... Bref, je ne vois pas bien à
quel moment il peut y avoir un problème ?
je me mets à Qt, et je suis actuellement sur leur mécanisme de
passage de messages (slots et signals). Dans la documentation en guise
d'intro il y a l'assertion :
"Callbacks have two fundamental flaws. Firstly they are not type
safe. We can never be certain that the processing function will call
the callback with the correct arguments."
Que je ne comprends pas. J'imagine qu'il s'agit encore d'une histoire
de compilation dynamique versus statique mais ça ne m'avance pas. Je
m'explique : pour moi un callback c'est juste un pointeur de fonction
(appelons le p) , et un pointeur de fonction est typé (on sait ce
qu'il renvoit et ce qu'il prend comme arguments). de meme, lorsque je
vais vouloir affubler une valeur à p, j'aurais le type de p et celui
de la fonction f vers laquelle je veux pointer... Donc moyen de
détecter s'il y a un problème de type... Enfin, lorsque je vais
utiliser p (donc f), j'ai le type de p (qui est celui de f) et donc
encore moyen de vérifier tous les types... Bref, je ne vois pas bien à
quel moment il peut y avoir un problème ?
On 1 Feb 2007 08:03:17 -0800, "meow" :Je m'explique : pour moi un callback c'est juste un pointeur de fonction
Souvent, ça ne suffit pas. Il faut aussi un pointeur vers des données,
pour que la fonction callback sache quelles données utiliser (i.e.
sache quoi faire). Et comme la fonction principale ne connaît rien de
tes structures de données, le pointeur en question est souvent un
void*.
On 1 Feb 2007 08:03:17 -0800, "meow" <schwarz.ben@gmail.com>:
Je m'explique : pour moi un callback c'est juste un pointeur de fonction
Souvent, ça ne suffit pas. Il faut aussi un pointeur vers des données,
pour que la fonction callback sache quelles données utiliser (i.e.
sache quoi faire). Et comme la fonction principale ne connaît rien de
tes structures de données, le pointeur en question est souvent un
void*.
On 1 Feb 2007 08:03:17 -0800, "meow" :Je m'explique : pour moi un callback c'est juste un pointeur de fonction
Souvent, ça ne suffit pas. Il faut aussi un pointeur vers des données,
pour que la fonction callback sache quelles données utiliser (i.e.
sache quoi faire). Et comme la fonction principale ne connaît rien de
tes structures de données, le pointeur en question est souvent un
void*.
In article ,
meow wrote:je me mets à Qt, et je suis actuellement sur leur mécanisme de
passage de messages (slots et signals). Dans la documentation en guise
d'intro il y a l'assertion :
"Callbacks have two fundamental flaws. Firstly they are not type
safe. We can never be certain that the processing function will call
the callback with the correct arguments."
Que je ne comprends pas. J'imagine qu'il s'agit encore d'une histoire
de compilation dynamique versus statique mais ça ne m'avance pas. Je
m'explique : pour moi un callback c'est juste un pointeur de fonction
(appelons le p) , et un pointeur de fonction est typé (on sait ce
qu'il renvoit et ce qu'il prend comme arguments). de meme, lorsque je
vais vouloir affubler une valeur à p, j'aurais le type de p et celui
de la fonction f vers laquelle je veux pointer... Donc moyen de
détecter s'il y a un problème de type... Enfin, lorsque je vais
utiliser p (donc f), j'ai le type de p (qui est celui de f) et donc
encore moyen de vérifier tous les types... Bref, je ne vois pas bien à
quel moment il peut y avoir un problème ?
Pour comprendre le probleme, il te faut analyser un peu plus. Dans
l'utilisation d'un callback, il y a deux bouts de logiciel:
- le widget
- l'application utilisateur.
Le probleme ici, c'est que c'est le widget qui est responsable de la
declaration du callback, et que c'est l'application qui va s'en servir.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
Le probleme ici, c'est le user-data qui permet a l'application de retrouv er
ce qu'elle veut comme donnees personnelles liees a l'utilisation du gadge t,
et qu'on ne peut pas trop typer. On peut s'en sortir avec une hierarchie
de classes, mais ca impose d'avoir les user-data qui soient derivees d'une
classe specifique a l'execution.
Au moment ou l'interface de qt a ete concue, il n'y avait pas de mecanisme
en usage repandu dans le monde C++ qui permettait de faire ce que le
mecanisme de signal/slot de qt sait faire.
Maintenant, si ma memoire est
bonne, on resoudrait ce probleme avec les bons templates et les bons
objets fonctionnels. Mais ce sont des techniques qui n'etaient pas vraime nt
au point a l'epoque.
Comme tu le notes egalement, il y a aussi le cote dynamique de la chose,
de pouvoir accrocher slots et signaux de facon a peu pres arbitraire,
qui n'est pas si facile que ca a faire en C++ pur.
In article <1170345797.276566.200610@q2g2000cwa.googlegroups.com>,
meow <schwarz.ben@gmail.com> wrote:
je me mets à Qt, et je suis actuellement sur leur mécanisme de
passage de messages (slots et signals). Dans la documentation en guise
d'intro il y a l'assertion :
"Callbacks have two fundamental flaws. Firstly they are not type
safe. We can never be certain that the processing function will call
the callback with the correct arguments."
Que je ne comprends pas. J'imagine qu'il s'agit encore d'une histoire
de compilation dynamique versus statique mais ça ne m'avance pas. Je
m'explique : pour moi un callback c'est juste un pointeur de fonction
(appelons le p) , et un pointeur de fonction est typé (on sait ce
qu'il renvoit et ce qu'il prend comme arguments). de meme, lorsque je
vais vouloir affubler une valeur à p, j'aurais le type de p et celui
de la fonction f vers laquelle je veux pointer... Donc moyen de
détecter s'il y a un problème de type... Enfin, lorsque je vais
utiliser p (donc f), j'ai le type de p (qui est celui de f) et donc
encore moyen de vérifier tous les types... Bref, je ne vois pas bien à
quel moment il peut y avoir un problème ?
Pour comprendre le probleme, il te faut analyser un peu plus. Dans
l'utilisation d'un callback, il y a deux bouts de logiciel:
- le widget
- l'application utilisateur.
Le probleme ici, c'est que c'est le widget qui est responsable de la
declaration du callback, et que c'est l'application qui va s'en servir.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
Le probleme ici, c'est le user-data qui permet a l'application de retrouv er
ce qu'elle veut comme donnees personnelles liees a l'utilisation du gadge t,
et qu'on ne peut pas trop typer. On peut s'en sortir avec une hierarchie
de classes, mais ca impose d'avoir les user-data qui soient derivees d'une
classe specifique a l'execution.
Au moment ou l'interface de qt a ete concue, il n'y avait pas de mecanisme
en usage repandu dans le monde C++ qui permettait de faire ce que le
mecanisme de signal/slot de qt sait faire.
Maintenant, si ma memoire est
bonne, on resoudrait ce probleme avec les bons templates et les bons
objets fonctionnels. Mais ce sont des techniques qui n'etaient pas vraime nt
au point a l'epoque.
Comme tu le notes egalement, il y a aussi le cote dynamique de la chose,
de pouvoir accrocher slots et signaux de facon a peu pres arbitraire,
qui n'est pas si facile que ca a faire en C++ pur.
In article ,
meow wrote:je me mets à Qt, et je suis actuellement sur leur mécanisme de
passage de messages (slots et signals). Dans la documentation en guise
d'intro il y a l'assertion :
"Callbacks have two fundamental flaws. Firstly they are not type
safe. We can never be certain that the processing function will call
the callback with the correct arguments."
Que je ne comprends pas. J'imagine qu'il s'agit encore d'une histoire
de compilation dynamique versus statique mais ça ne m'avance pas. Je
m'explique : pour moi un callback c'est juste un pointeur de fonction
(appelons le p) , et un pointeur de fonction est typé (on sait ce
qu'il renvoit et ce qu'il prend comme arguments). de meme, lorsque je
vais vouloir affubler une valeur à p, j'aurais le type de p et celui
de la fonction f vers laquelle je veux pointer... Donc moyen de
détecter s'il y a un problème de type... Enfin, lorsque je vais
utiliser p (donc f), j'ai le type de p (qui est celui de f) et donc
encore moyen de vérifier tous les types... Bref, je ne vois pas bien à
quel moment il peut y avoir un problème ?
Pour comprendre le probleme, il te faut analyser un peu plus. Dans
l'utilisation d'un callback, il y a deux bouts de logiciel:
- le widget
- l'application utilisateur.
Le probleme ici, c'est que c'est le widget qui est responsable de la
declaration du callback, et que c'est l'application qui va s'en servir.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
Le probleme ici, c'est le user-data qui permet a l'application de retrouv er
ce qu'elle veut comme donnees personnelles liees a l'utilisation du gadge t,
et qu'on ne peut pas trop typer. On peut s'en sortir avec une hierarchie
de classes, mais ca impose d'avoir les user-data qui soient derivees d'une
classe specifique a l'execution.
Au moment ou l'interface de qt a ete concue, il n'y avait pas de mecanisme
en usage repandu dans le monde C++ qui permettait de faire ce que le
mecanisme de signal/slot de qt sait faire.
Maintenant, si ma memoire est
bonne, on resoudrait ce probleme avec les bons templates et les bons
objets fonctionnels. Mais ce sont des techniques qui n'etaient pas vraime nt
au point a l'epoque.
Comme tu le notes egalement, il y a aussi le cote dynamique de la chose,
de pouvoir accrocher slots et signaux de facon a peu pres arbitraire,
qui n'est pas si facile que ca a faire en C++ pur.
Comme tu le notes egalement, il y a aussi le cote dynamique de la chose,
de pouvoir accrocher slots et signaux de facon a peu pres arbitraire,
qui n'est pas si facile que ca a faire en C++ pur.
Tu plaisantes, non ? Même en Java, c'est facile (et c'est comme
ça qu'ont fonctionné toutes les versions de AWT et de Swing).
Comme tu le notes egalement, il y a aussi le cote dynamique de la chose,
de pouvoir accrocher slots et signaux de facon a peu pres arbitraire,
qui n'est pas si facile que ca a faire en C++ pur.
Tu plaisantes, non ? Même en Java, c'est facile (et c'est comme
ça qu'ont fonctionné toutes les versions de AWT et de Swing).
Comme tu le notes egalement, il y a aussi le cote dynamique de la chose,
de pouvoir accrocher slots et signaux de facon a peu pres arbitraire,
qui n'est pas si facile que ca a faire en C++ pur.
Tu plaisantes, non ? Même en Java, c'est facile (et c'est comme
ça qu'ont fonctionné toutes les versions de AWT et de Swing).
Marc Espie wrote:Le probleme ici, c'est que c'est le widget qui est responsable de la
declaration du callback, et que c'est l'application qui va s'en servir.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
Marc Espie wrote:
Le probleme ici, c'est que c'est le widget qui est responsable de la
declaration du callback, et que c'est l'application qui va s'en servir.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
Marc Espie wrote:Le probleme ici, c'est que c'est le widget qui est responsable de la
declaration du callback, et que c'est l'application qui va s'en servir.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
On 2 Feb 2007 02:35:01 -0800, "James Kanze" :En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
Sauf quand c'est imposé par une bibliothèque prévue pour le C
(l'API Win32 par exemple).
On 2 Feb 2007 02:35:01 -0800, "James Kanze" <james.kanze@gmail.com>:
En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
Sauf quand c'est imposé par une bibliothèque prévue pour le C
(l'API Win32 par exemple).
On 2 Feb 2007 02:35:01 -0800, "James Kanze" :En C, ca se termine pratiquement toujours par un
T (*callback)(T1 p1, T2 p2, ... , void *user_data);
En C, oui. Mais nous sommes en C++, et personne qui ne connaisse
le C++ ferait comme ça.
Sauf quand c'est imposé par une bibliothèque prévue pour le C
(l'API Win32 par exemple).
(Pour une
autre solution, voir boost::signals, qui se base sur
boost::function, plutôt que d'une classe abstraite.)
(Pour une
autre solution, voir boost::signals, qui se base sur
boost::function, plutôt que d'une classe abstraite.)
(Pour une
autre solution, voir boost::signals, qui se base sur
boost::function, plutôt que d'une classe abstraite.)