3

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

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对象?
或者(更全面地)如何正确地从这种方法返回?

4

1 回答 1

4

当没有要返回的数据时,事情就简单了——这应该是现代 C++ 中首先要尝试的事情:

return {};

或者,如果您的目标是一些过时的平台(<Qt 5.6):

return QFuture<bool>();

这样你就会得到一个无效的未来。没有办法直接创建一个带有预设数据的未来,你必须使用QFutureInterface它:

// 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());
}
于 2018-06-11T19:38:05.303 回答