gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:25:43 24 4
gpt4 key购买 nike

我喜欢 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)

最佳答案

您不必重新实现它: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 的目的。

关于c++ - 如何在自己的方法中使用 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38126723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com