我想使用QtConcurrent::mapped并行地处理数据的std::vector。当我使用一个空闲函数作为MapFunctor的QtConcurrent::mapped参数时,一切似乎都很好。但是,当我使用lambda或成员指针时,返回的未来是一个QFuture<void>,而不是结果类型的QFuture。下面是一个最少可重复的例子:
#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也有类似之处。为什么f2和f3 QFuture<void>而不是QFuture<int>
(我知道在创造期货之后,我必须实际使用期货,我的问题只是关于期货的类型。)
发布于 2021-02-26 18:41:30
S::func版本不能工作,因为func有错误的签名。
如果您有一个集合C,则mapped函数迭代此集合中的所有元素,为C的每个实例调用传递的成员函数。
vector<S> C{S(1),S(2),..};通过
mapped(C,&S::func)将执行:
C[0].func();
C[1].func();
...如果上面的调用是由map函数执行的,其签名是:
RetType mapFunction(const S&)对const对象调用成员函数,因此也应该将其标记为const。
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);都没问题。
发布于 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()不是静态函数,因此不能在这里使用。
https://stackoverflow.com/questions/66390815
复制相似问题