c++ - 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
。为什么应该f2
而f3
QFuture<void>
不是QFuture<int>
?
(我知道我必须在创建期货后实际使用它们,我的问题只是关于期货的类型。)
解决方案
自动类型推导不适用于 lambda,您必须传递正确的 std::function
std::function<int(int)> f = [](int x) { return x + 1; }; QFuture<int> f2 = QtConcurrent::mapped(v, f);
f3 不能工作,因为 S::func() 不是静态函数,因此不能在这里使用。
推荐阅读
- gmail-api - Gmail 转发 api 说禁止
- python - 在 django-python 中迁移我的数据库时出现错误
- sql - Powershell - 将单独的数组值导入列
- python - 如何使用 alembic 运行修订?
- windows - 在信息亭模式下手动更新 Windows 应用程序不起作用
- amazon-web-services - .net 核心框架是否支持 redshift?
- firebase - 如果没有匹配的数据,Firebase 实时数据库会触发“null”错误
- kubernetes - 即使指定了 cpu 限制,在 pod 部署期间出现“必须指定 limits.cpu”错误
- javascript - 如何使 d3.js 中的可扩展树垂直?
- ocaml - 运行程序时没有 Netaccel_link 错误的源文件