如何在C ++ lambda中访问QObject :: sender?

时间:2013-02-05 21:57:49

标签: c++ c++11 lambda qt5

这是一个相当不寻常的问题 - 但仍然存在问题。我有一个函数接受lambda作为参数,然后将其传递给QObject::connect

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, f);
    //...
}

MyClass::doSomething的示例调用可能如下所示:

doSomething([]()
{
    // how do I get access to the sender???
});

正如您在评论中所说,无法访问QObject::sender以获取指向发出信号的QObject的指针。因为发出信号的类不在lambda的创建范围内,所以无法在lambda中引用它。

我有哪些选择?


修改:我尝试使用Andy的建议(std::bind),但我最终得到了一个几乎无法理解的模板错误:

http://paste.ubuntu.com/1614425/

摘录:

decltype cannot resolve address of overloaded function

...它指向QObject::connect来电。

1 个答案:

答案 0 :(得分:4)

如果我正确理解了您的要求,您可以先让lambda仿函数接受相应类型的参数(在此处通过引用传递,以便处理终身问题):

doSomething([](QNetworkReply* p)
{
    // Here you have the sender referenced by p
});

然后,您的doSomething()模板函数可以使用std::bind()来确保使用适当的对象作为参数调用lambda:

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, bind(f, network_reply));
    //...
}