创建没有参数的sigc :: slot

时间:2014-03-21 16:00:54

标签: c++ signals gtkmm

我尝试将超时处理程序连接到我的gtkmm代码,如gtkmm book所示。但是,我的特定on_timeout()函数不需要任何参数,我正在努力正确创建一个sigc::slot对象以传递给connect函数,因为我遇到以下内容错误(等等):

error: no matching function for call to ‘bind(sigc::bound_mem_functor0<bool, DerivedWindow>)

和几个

candidate expects 2 arguments, 1 provided

指的是sigc::bind。我如何调用这两个函数:

_timeout_slot = sigc::bind(sigc::mem_fun(*this,&DerivedWindow::on_timeout));
_connection = Glib::signal_timeout().connect(_timeout_slot,timeout_value);

我是在DerivedWindow派生的班级Gtk::Window上执行此操作的。我究竟做错了什么?如果我不需要任何参数,是否需要使用sigc::bindsigc::mem_func

1 个答案:

答案 0 :(得分:2)

此处不需要sigc::bind,因为您没有绑定任何其他参数的插槽(处理取消引用this的成员函数指针已由sigc::mem_fun处理)。所以,这就足够了:

_timeout_slot = sigc::mem_fun(*this, &MyWindow::on_timeout)
_connection = Glib::signal_timeout().connect(_timeout_slot, timeout_value);

快速提示:如果你可以使用C ++ 11,你可以将lambdas作为参数传递给connect,这样可以使事情更具可读性:

_connection = Glib::signal_timeout().connect([this]{ return on_timeout(); }, timeout_value);

为此,您可能需要添加

namespace sigc{
SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
}

此外,如果您想连接到类实例的信号(比如Gtk::Button* btn),您可以通过定义宏来使事情变得更紧凑

#define CONNECT(src, signal, ...) (src)->signal_##signal().connect(__VA_ARGS__)

然后允许你写

CONNECT(btn, clicked, [this]{ btn_clicked_slot(); });