首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtConcurrent::映射返回类型问题

QtConcurrent::映射返回类型问题
EN

Stack Overflow用户
提问于 2021-02-26 18:09:50
回答 2查看 116关注 0票数 0

我想使用QtConcurrent::mapped并行地处理数据的std::vector。当我使用一个空闲函数作为MapFunctorQtConcurrent::mapped参数时,一切似乎都很好。但是,当我使用lambda或成员指针时,返回的未来是一个QFuture<void>,而不是结果类型的QFuture。下面是一个最少可重复的例子:

代码语言:javascript
复制
#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文档中可以看出,这一切都应该很好。但是,我得到了f2f3的编译错误

代码语言:javascript
复制
.../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>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-26 18:41:30

S::func版本不能工作,因为func有错误的签名。

如果您有一个集合C,则mapped函数迭代此集合中的所有元素,为C的每个实例调用传递的成员函数。

代码语言:javascript
复制
vector<S> C{S(1),S(2),..};

通过

代码语言:javascript
复制
mapped(C,&S::func)

将执行:

代码语言:javascript
复制
   C[0].func();
   C[1].func();
   ...

如果上面的调用是由map函数执行的,其签名是:

代码语言:javascript
复制
   RetType mapFunction(const S&)

对const对象调用成员函数,因此也应该将其标记为const。

代码语言:javascript
复制
struct S {
  int x;
  int func() const { return x + 1; } // + const and no arguments
};

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

都没问题。

票数 2
EN

Stack Overflow用户

发布于 2021-02-26 18:26:11

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66390815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档