Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何创建具有即时可用价值的QFuture?_Qt_Qtconcurrent_Qfuture - Fatal编程技术网

Qt 如何创建具有即时可用价值的QFuture?

Qt 如何创建具有即时可用价值的QFuture?,qt,qtconcurrent,qfuture,Qt,Qtconcurrent,Qfuture,我有一个函数,它返回QFuture对象,作为QtConcurrent::run计算的结果。但是,在运行并发方法之前,可能存在一些条件,在这些条件下,我需要从函数中手动返回一个包含future的值 QFuture<bool> foo(const QString &bar) { if (bar.isEmpty()) { return QFuture<bool>(false); // This does not work. //

我有一个函数,它返回
QFuture
对象,作为
QtConcurrent::run
计算的结果。但是,在运行并发方法之前,可能存在一些条件,在这些条件下,我需要从函数中手动返回一个包含future的值

QFuture<bool> foo(const QString &bar)
{
    if (bar.isEmpty()) {
        return QFuture<bool>(false); // This does not work.
        // Here I need to return from the function, but I don't know how to do it.
    }
    return QtConcurrent::run([=]() -> bool {
        // Asynchronous computations...
    });
}
QFuture foo(const QString&bar)
{
if(bar.isEmpty()){
返回QFuture(false);//这不起作用。
//这里我需要从函数返回,但我不知道如何做。
}
返回QtConcurrent::run([=]()->bool{
//异步计算。。。
});
}
如何手动创建
QFuture
对象?


或者(更全面地说)如何正确地从这种方法返回?

当没有数据可返回时,事情很简单-这应该是在现代C++中尝试的第一件事:

return {};

或者,如果您的目标是某个过时的平台(如果
bar
是空的
QString
,那么抛出一个合适的异常会更简单/可以接受吗?您的示例对我很有用
return QFuture<bool>();
// https://github.com/KubaO/stackoverflown/tree/master/questions/qfuture-immediate-50772976
#include <QtConcurrent>

template <typename T> QFuture<T> finishedFuture(const T &val) {
   QFutureInterface<T> fi;
   fi.reportFinished(&val);
   return QFuture<T>(&fi);
}

QFuture<bool> foo(bool val, bool valid) {
   if (!valid)
      return {};
   return finishedFuture(val);
}

int main() {
   Q_ASSERT(foo(true, true));
   Q_ASSERT(!foo(false, true));
   Q_ASSERT(foo(false, false).isCanceled());
   Q_ASSERT(foo(true, false).isCanceled());
}