Как создать QFuture с немедленно доступным значением?

У меня есть функция, которая возвращает 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 объект?
Или (более глобально), как правильно вернуться из такого метода?

1 ответ

Решение

Когда нет данных для возврата, все просто - это должно быть первое, что нужно попробовать в современном C++:

return {};

Или, если вы нацелены на какую-то устаревшую платформу (

return QFuture<bool>();

Таким образом, вы получите недопустимое будущее. Нет способа напрямую создать будущее, которое несет в себе предустановленные данные, вам придется использовать QFutureInterface для этого:

// https://github.com/KubaO/stackrun/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());
}
Другие вопросы по тегам