这是一个相当不寻常的问题 - 但仍然是一个问题。我有一个接受 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
调用。
最佳答案
如果我正确理解了您的要求,您可以首先让您的 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));
//...
}
关于c++ - 如何在 C++ lambda 中访问 QObject::sender?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14717755/