Le fait que la vérification de signature se fasse au runtime n'est pas un avantage pour moi non plus, c'est plus ou moins un mal nécessaire.
Comme dit, le C++ n'as pas de classes anonymes, donc si tu veux faire comme en Java, il faudrait que ta classe qui traite les clics et autres évènements hérite de tout un tas d'interfaces: ClickListener, FocusListener, ValueChangedListener, etc... en fonction de ce que tu veux faire. En plus si tu as deux boutons, les deux vont appeler ClickListener::clicked() et c'est à toi de chercher de quel bouton vient le clic. Les classes anonymes de Java résolvent ce problème.
Là où le système de Qt est super souple c'est que ton slot a juste besoin de correspondre à la signature du signal et paf, ça marche, une ligne de code et la connection est faite. Perso, je trouve ça même plus pratique que le système de Java, mais ça c'est plus une question de goût qu'un véritable argument.
Qt utilise moc, un préprocesseur pour faire cela. En C++, il est possible d'écrire un système de signaux/slots sans préprocesseur, libsigc++ et boost le font à l'aide de templates. C'est assez similaire à l'utilisation. Ça n'a pas été utilisé par Qt pour des raisons historiques: à l'époque de Qt 1/2 tous les compilateurs C++ supportés par Qt ne géraient pas bien les templates. Du coup quitte à se coltiner un préprocesseur autant lui faire faire un max de chose, genre ajouter des possibilités d'introspection. En Qt 4 il est maintenant possible d'invoquer un méthode par son nom:
[^] # Re: signals/slots?
Posté par alberthier (site web personnel) . En réponse à la dépêche Qt Software ouvre Qt à la communauté et publie Qt Jambi 4.5. Évalué à 5.
Comme dit, le C++ n'as pas de classes anonymes, donc si tu veux faire comme en Java, il faudrait que ta classe qui traite les clics et autres évènements hérite de tout un tas d'interfaces: ClickListener, FocusListener, ValueChangedListener, etc... en fonction de ce que tu veux faire. En plus si tu as deux boutons, les deux vont appeler ClickListener::clicked() et c'est à toi de chercher de quel bouton vient le clic. Les classes anonymes de Java résolvent ce problème.
Là où le système de Qt est super souple c'est que ton slot a juste besoin de correspondre à la signature du signal et paf, ça marche, une ligne de code et la connection est faite. Perso, je trouve ça même plus pratique que le système de Java, mais ça c'est plus une question de goût qu'un véritable argument.
Qt utilise moc, un préprocesseur pour faire cela. En C++, il est possible d'écrire un système de signaux/slots sans préprocesseur, libsigc++ et boost le font à l'aide de templates. C'est assez similaire à l'utilisation. Ça n'a pas été utilisé par Qt pour des raisons historiques: à l'époque de Qt 1/2 tous les compilateurs C++ supportés par Qt ne géraient pas bien les templates. Du coup quitte à se coltiner un préprocesseur autant lui faire faire un max de chose, genre ajouter des possibilités d'introspection. En Qt 4 il est maintenant possible d'invoquer un méthode par son nom:
QMetaObject::invokeMethod(this, "myMethod", Q_ARG(int, 1));