connect(sender, &Sender::valueChanged, [=](const QString &newValue) {
receiver->updateValue("senderValue", newValue);
});
我想实现自己的方法,将lambda表达式作为参数。
在我的特定情况下,我想重新创建Javascript函数setTimeout()。
正确的语法如何将lambda作为我方法的参数?我希望lambda不要有任何参数或其他返回类型而不是void。
void setTimeout(/* SOME_TYPE callback */, int timeout)
{
QTimer *timer = new QTimer(this);
timer->setInterval(timeout);
timer->setSingleShot(true);
connect(timer, &QTimer::timeout, (){
//This lambda should be an argument
});
//connect(timer, &QTimer::timeout, callback);
connect(timer, &QTimer::timeout, timer, &QObject::deleteLater);
timer->start();
}
我无法找到QObject中定义的方法。有些只是为文档生成定义的。 (#ifdef Q_QDOC
)
答案 0 :(得分:1)
您无需重新实现它:QTimer::singleShot
完成所有操作。
如果你想包装singleShot
或connect
,只要目标方法接受它,你就不会真正关心可调用的内容。 onTimeout
没有理由成为班级成员。它应该是一个自由函数:我们正在编写C ++,而不是Java。
// https://github.com/KubaO/stackoverflown/tree/master/questions/forward-callable-38126723
#include <QtCore>
template <typename C>
void onTimeout(int msec, C && callable) {
QTimer::singleShot(msec, std::forward<C>(callable));
}
template <typename C>
void onTimeout(int msec, QObject * context, C && callable) {
QTimer::singleShot(msec, context, std::forward<C>(callable));
}
int main(int argc, char ** argv) {
QCoreApplication app{argc, argv};
QObject context;
QThread thread;
context.moveToThread(&thread);
thread.start();
onTimeout(1000, []{ qDebug() << "T+1s"; });
onTimeout(2000, &context, [&]{ qDebug() << "T+2s"; thread.quit(); });
QObject::connect(&thread, &QThread::finished, &app, &QCoreApplication::quit);
return app.exec();
}
第一个超时是从主线程的事件循环处理的。第二个超时是从工作线程的事件循环处理的 - 这是context
参数的用途。在实现接受可调用的函数/方法时,应始终可选地接受一个上下文对象,该对象指示可调用执行的线程。默认情况是在当前线程的事件循环中执行它。
另请参阅that question有关std::forward
的目的。
答案 1 :(得分:0)
您可能拥有template<typename T>
并使用const T&
,其优势在于可以快速使用仿函数 - 或者您可以使用std::function<>
,这有点慢但是也可以通过虚函数来完成。
答案 2 :(得分:0)
创建应该接受相应模板类型std::function<Res(Arg,...)>' from the header
functional`的lambda的参数。