我想在gtk++的goocanvas中使用lambda表达式。以我的理解,这意味着我必须能够将lambda放入sigc++函子中。
我尝试过这样的事情:
sigc::slot<bool, const Glib::RefPtr<Goocanvas::Item>& , GdkEventMotion* > slot2=
[]( const Glib::RefPtr<Goocanvas::Item>& item, GdkEventMotion* ev)->bool
{
cout << "Lambda " << endl; return false;
};
((Glib::RefPtr<Goocanvas::Item>&)item1)->signal_motion_notify_event().connect( slot2);
但这不会编译。
是否有机会让sigc直接与lambda或更好的gtkmm一起使用,而无需sigc++中间体:-)
最佳答案
对于没有参数的void返回函数/方法,这很简单,例如(gcc 4.6,4.7):
fileButton.signal_pressed().connect([this]{on_file_button_clicked();});
不幸的是,我无法获得返回值或接受参数的方法进行编译,因此不得不求助于
sigc::mem_fun()
。似乎最近有一些 Activity 来解决此问题,例如this commit。如果您具有sigc++ 2.2.11或更高版本,则可以尝试定义SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
,但是我不知道它的效果如何。也相关的是this bug report。