Как вернуть std :: tuple из задачи std :: async - PullRequest
0 голосов
/ 08 мая 2018

Как я могу запустить функцию-член как задачу 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' не соответствует списку аргументов.

1 Ответ

0 голосов
/ 08 мая 2018

Кажется, проблема в том, что у вас есть и элемент данных, и функция-член с именем calc.Переименование одного решает проблему.

[Пример в реальном времени]

...