C++ 如何在C+中访问QObject::sender+;兰姆达?

C++ 如何在C+中访问QObject::sender+;兰姆达?,c++,c++11,lambda,qt5,C++,C++11,Lambda,Qt5,这是一个相当不寻常的问题——但仍然是一个问题。我有一个函数,它接受lambda作为参数,然后将其传递给QObject::connect: template<typename Functor> void MyClass::doSomething(Functor f) { connect(network_reply, &QNetworkReply::finished, f); //... } 从我的评论中可以看出,无法访问QObject::sender以获取指向

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

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, f);
    //...
}
从我的评论中可以看出,无法访问
QObject::sender
以获取指向发出信号的
QObject
的指针。由于发出信号的类不在创建lambda的范围内,因此无法在lambda内引用它

我有什么选择


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

摘录:

decltype cannot resolve address of overloaded function decltype无法解析重载函数的地址
…它指向
QObject::connect
调用。

如果我正确理解了您的需求,您可以首先让lambda functor接受适当类型的参数(此处通过引用传递,因此请注意生存期问题):

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

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, bind(f, network_reply));
    //...
}
模板
void MyClass::doSomething(函子f)
{
连接(网络回复,&QNetworkReply::完成,绑定(f,网络回复));
//...
}

您是否试图使lambda接收指向
MyClass
对象的指针?它需要指向
MyClass::doSomething
中存在的
QNetworkReply
的指针。通过“存在于
MyClass::doSomething
”您的意思是它是该函数的本地对象?或者它是
MyClass
的成员变量?@AndyProwl:它存在于
MyClass::doSomething
中。它不是一个成员变量。@GeorgeEdison:我尝试了一个解决方案,但我不确定我是否正确理解了您的要求。由于格式问题,我没有将其作为评论发布。是的,这正是我要寻找的。非常感谢。这也避免了我必须使用
QObject::sender
@GeorgeEdison:好的,很高兴它有帮助:-)@GeorgeEdison:忘记了一个小细节:绑定时,应该使用
ref(…)
,或者参数将按值传递。没关系-
network\u reply
实际上是一个
QNetworkReply*
,所以按值传递不是问题。我想我说得太快了-我收到一个错误,
decltype无法解析重载函数的地址,它指向
QObject::connect
doSomething([](QNetworkReply* p)
{
    // Here you have the sender referenced by p
});
template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, bind(f, network_reply));
    //...
}