我想在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

08-05 17:35