首页 > 解决方案 > QtConcurrent::mapped 返回类型问题

问题描述

我想用来并行QtConcurrent::mapped处理std::vector数据。当我使用自由函数MapFunctor作为QtConcurrent::mapped. 但是,当我使用 lambda 或成员指针时,返回的未来是 a QFuture<void>,而不是QFuture结果类型的 a 。下面是一个最小的可重现示例:

#include <QtConcurrent>

int free_func(int x) { return x + 3; }

struct S {
  int x;

  int func(S y) { return x + y.x; }
};

void example() {
  std::vector<int> v = {1, 2, 3};

  QFuture<int> f1 = QtConcurrent::mapped(v, free_func);
  QFuture<int> f2 = QtConcurrent::mapped(v, [](int x) { return x + 1; });

  std::vector<S> v2 = {S{1}, S{2}, S{3}};
  QFuture<int> f3 = QtConcurrent::mapped(v2, &S::func);
}

据我阅读Qt 文档可以看出,这一切都应该没问题。但是,我得到了编译错误,f2并且f3读取

.../test.cpp:15: error: conversion from ‘QFuture<void>’ to non-scalar type ‘QFuture<int>’ requested
.../test.cpp: In function ‘void example()’:
.../test.cpp:15:41: error: conversion from ‘QFuture<void>’ to non-scalar type ‘QFuture<int>’ requested
   15 |   QFuture<int> f2 = QtConcurrent::mapped(v, [](int x) { return x + 1; });
      |                     ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

和类似的东西f3。为什么应该f2f3 QFuture<void>不是QFuture<int>

(我知道我必须在创建期货后实际使用它们,我的问题只是关于期货的类型。)

标签: c++qt

解决方案


自动类型推导不适用于 lambda,您必须传递正确的 std::function std::function<int(int)> f = [](int x) { return x + 1; }; QFuture<int> f2 = QtConcurrent::mapped(v, f);

f3 不能工作,因为 S::func() 不是静态函数,因此不能在这里使用。


推荐阅读