如何在自己的方法中使用lambda表达式

时间:2016-06-30 14:54:03

标签: c++ qt lambda

我喜欢QObject::connect

的新语法
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

3 个答案:

答案 0 :(得分:1)

您无需重新实现它:QTimer::singleShot完成所有操作。

如果你想包装singleShotconnect,只要目标方法接受它,你就不会真正关心可调用的内容。 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的参数。