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

标签 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 调用。

最佳答案

如果我正确理解了您的要求,您可以首先让您的 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/

相关文章:

c++ - lambda函数与gsl的数值积分

C++ : Find the closest values in an array

c++ - 具有可变参数模板的类似 MPL 的 vector : Insertion

c++ - 一个线程结束后调用另一个线程中的方法

java - 如何从作为 lambda 传递的函数接口(interface)对象实例获取参数?

c++ - 无法访问类 'A' 中声明的 protected 成员

c++ - 多个提升 io_service 用于单独线程上的多个网卡

c++ - 我可以调整从中移出的 vector 的大小吗?

java - FunctionalInterface Comparator 有 2 个抽象方法

c# - 将表达式与运算符 && 组合