绑定额外参数

如果你想使用一个信号处理函数从多个部件捕获同一个信号,你可能希望信号处理函数能收到一些额外的信息。例如,你可能想知道那个按钮被点击了。你可以使用sigc::bind()。这是helloworld2示例的部分代码:

m_button1.signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &HelloWorld::on_button_clicked), "button 1"));
这表示我们希望信号向信号处理函数发送一个额外的Glib::ustring参数,并且该参数的值为"button 1"。当然,我们将会需要向信号处理函数的声明中添加额外的参数:
void on_button_clicked(const Glib::ustring& data);
。当然,正常的"clicked"信号处理函数是没有参数的。

sigc::bind()并不常用,不过偶尔会对你有所帮助(译注:很多时候直接使用lambda比调用sigc::bind要好)。如果你对使用GTK编程很熟悉,就会注意到,这和GTK中所有的回调函数都具有一个额外的gpointer data参数十分的类似。因为在C语言中要派生一个部件十分的困难,通过让GTK中所有回调函数都具有一个这样的额外参数用于传递本该储存于派生部件成员中的数据可以有效降低代码复杂度。而在gtkmm中派生部件类十分的简单,所以这种强侵入式的写法不再需要了。