c++ - 如何从 std::async 任务返回 std::tuple
问题描述
如何将成员函数作为 std::async 任务启动,它返回一个 std::tuple。
示例代码:
#include <iostream>
#include <future>
#include <tuple>
#include <numeric>
class Foo {
bool calc;
public:
Foo(bool b) : calc(b)
{}
std::tuple<long, double> calc(std::vector<int> a) {
long sum = 0;
double avg = 0.0;
if ((*this).calc) {
long sum = std::accumulate(a.begin(), a.end(), 0);
double avg = sum / a.size();
}
return std::make_tuple(sum, avg);
}
void call_calc(std::vector<int> i) {
auto handle = std::async(&Foo::calc, this, i);
auto resultTuple = handle.get();
std::cout << "Sum = " << std::get<0>(resultTuple) << " Average = " << std::get<1>(resultTuple) << std::endl;
}
};
int main() {
std::vector<int> a{ 2, 5, 6, 7, 3 };
Foo foo(true);
foo.call_calc(a);
}
在此示例中,没有成员变量,代码可以正常工作。上面的代码为以下几行引发编译错误:
auto handle = std::async(&Foo::calc, this, i);
错误:没有重载函数 'std::async' 的实例与参数列表匹配。
std::cout << "Sum = " << std::get<0>(resultTuple) << " Average = " << std::get<1>(resultTuple) << std::endl;
错误:没有重载函数 'std::get' 的实例与参数列表匹配。
解决方案
问题似乎是您同时拥有一个数据成员和一个名为calc
. 重命名解决了这个问题。
推荐阅读
- python - Pandas 用于汇总统计数据并查找最大和最小执行者
- qt - 使用 QDir 访问多个子文件夹
- java - 如何使用 Selenium 和 JAVA 比较来自不同页面的两个数字(带有测试失败选项。而不是控制台消息。)
- php - 基于属性古腾堡块的自定义端点 API
- python - 旋转并合并两个 pandas 数据框
- java - Spring Boot 和构造函数注入
- batch-file - 使用一个变量对两个数字进行操作
- arrays - 在 Google 表格中将特定列合并为一列
- html - 如何仅加载与屏幕兼容的图标?
- ffmpeg - 单个图像+音频上的ffmpeg关键帧控制