创建不带参数的sigc::slot

Create sigc::slot with no arguments

本文关键字:sigc slot 参数 创建      更新时间:2023-10-16

我正在尝试连接超时处理程序到我的gtkmm代码,如gtkmm书中所示。但是,我的特定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);

我在Gtk::Window派生的DerivedWindow类上这样做。我到底做错了什么?如果我不需要任何参数,我需要使用sigc::bindsigc::mem_func吗?

这里不需要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作为参数传递给连接,这使得事情更容易读:

_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(); });