Liaison avec des paramètres supplémentaires

Si vous utilisez un gestionnaire de signal pour capter le même signal à partir de plusieurs éléments graphiques, vous pouvez souhaiter que le gestionnaire de signal reçoive des informations supplémentaires. Par exemple, savoir quel bouton a été cliqué. Vous pouvez réaliser cela avec sigc::bind(). Voici du code extrait de l'exemple helloworld2 déjà rencontré plus haut.

m_button1.signal_clicked().connect( 
            sigc::bind<Glib::ustring>( 
                                 sigc::mem_fun(
                                               *this, 
                                               &HelloWorld::on_button_clicked
                                              ),
                                 "bouton 1")
                                  );
Ce code indique que nous voulons que le signal envoie une valeur supplémentaire de type Glib::ustring au gestionnaire et que sa valeur soit égale à « bouton 1 ». Bien évidemment, nous devons ajouter ce paramètre supplémentaire dans la déclaration de fonction de notre gestionnaire de signal :
virtual void on_button_clicked(Glib::ustring data);
Bien évidemment encore, un gestionnaire normal de signal « clicked » ne comporterait pas de paramètre.

sigc::bind() n'est pas d'usage courant, mais peut-être le trouverez-vous commode parfois. Si vous êtes un familier de la programmation avec GTK+, vous avez alors probablement noté la similitude avec les paramètres supplémentaires gpointer data que toutes les fonctions de rappel possèdent. Généralement, cette possibilité est utilisée à l'excès dans GTK+ pour passer des informations qui devraient être stockées dans une donnée membre d'un élément graphique dérivé, mais la dérivation des éléments graphiques est très difficile en C. Nous avons beaucoup moins besoin de cette façon de faire dans gtkmm.