2

这是一个相当不寻常的问题——但仍然是一个问题。我有一个接受 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 无法解析重载函数的地址

...它指向QObject::connect呼叫。

4

1 回答 1

6

如果我正确理解了您的要求,您可以首先让您的 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));
    //...
}
于 2013-02-05T22:09:22.657 回答