我想在gtk ++中使用与goocanvas相关的lambda表达式。根据我的理解,这意味着我必须能够将我的lambda放在sigc ++ functor中。
我尝试过类似的东西:
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 ++中间体,是否有机会让sigc直接使用lambdas或更好的gtkmm: - )
答案 0 :(得分:5)
对于没有参数的void返回函数/方法,它非常简单,例如(gcc 4.6,4.7):
fileButton.signal_pressed().connect([this]{on_file_button_clicked();});
不幸的是,我无法获得返回值或参数采用方法进行编译,并且必须求助于sigc::mem_fun()
。似乎有一些最近的活动要解决这个问题,例如this commit。如果你有sigc ++ 2.2.11或更高版本,你可以尝试定义SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
,但我不知道这有多好用。
同样相关的是this bug report。
答案 1 :(得分:3)
我发现以下代码剪切了哪些工作。我不知道这是如何与sigc ++ lib交互的,但我可以将它用于简单的情况。也许其他人可以看看它。
#include <type_traits>
#include <sigc++/sigc++.h>
namespace sigc
{
template <typename Functor>
struct functor_trait<Functor, false>
{
typedef decltype (::sigc::mem_fun (std::declval<Functor&> (),
&Functor::operator())) _intermediate;
typedef typename _intermediate::result_type result_type;
typedef Functor functor_type;
};
}
更新: Libsigc现在能够处理lambas而无需任何额外的用户代码。如果使用任何当前版本,则必须删除上述代码。
答案 2 :(得分:0)
#include "helloworld.h"
#include <iostream>
HelloWorld::HelloWorld()
: m_button("Hello World") // creates a new button with label "Hello World".
{
// Sets the border width of the window.
set_border_width(10);
// When the button receives the "clicked" signal, it will call the
// on_button_clicked() method defined below.
m_button.signal_clicked().connect(
sigc::mem_fun(*this, &HelloWorld::on_button_clicked));
m_button.signal_clicked().connect([=]() { std::cout << "hello lambda\n"; });
// This packs the button into the Window (a container).
add(m_button);
// The final step is to display this newly created widget...
m_button.show();
}
HelloWorld::~HelloWorld() {}
void HelloWorld::on_button_clicked() {
std::cout << "hello method" << std::endl;
}
Lambda起作用。