C ++ - вектор фьючерсов - PullRequest
       16

C ++ - вектор фьючерсов

0 голосов
/ 07 февраля 2019

Следующий код не компилируется:

#include <iostream>
#include <future>
#include <vector>

class Calculator {
public:
    static int add(int a, int b)
    {
        return a + b;
    }
};

int main(int argc, char* argv[]) {
    std::vector<std::future<int>*> futures;

    for(auto i = 0; i < 4; i++) {
        auto future = new std::async(&Calculator::add, 1, 3);
        futures.push_back(future);
    }

    for(auto i = 0; i < 4; i++) {
        std::cout << futures[i]->get() << std::endl;
        delete futures[i];
    }

    return 0;
}

Я получаю следующую ошибку:

error: no type named 'async' in namespace 'std'

Как сохранить и вызвать get () для вектора фьючерсов?

Обновление:

Я использую C ++ 11, и асинхронный пример без векторной логики работает нормально.

1 Ответ

0 голосов
/ 07 февраля 2019

Будучи глубоко подозрительным к любому коду, использующему голые new или delete вызовы (кстати, хорошее отношение к разработке), я переписал его для использования более "современных" идиом C ++.

Я не был полностью уверен, почему вы думали, что вам нужно хранить указатели для фьючерсов, которые, казалось, усложняют ситуацию.В любом случае, фрагмент new std::async() вызвал проблемы для g++, и я считаю, что это является причиной вашей ошибки no type named 'async' in namespace 'std'.

Технически, это правильно, нет типа async в std, поскольку async является функцией , а не типом.

Измененный код выглядит следующим образом:

#include <iostream>
#include <future>
#include <vector>

class Calculator {
public:
    static int add(int a, int b) { return a + b; }
};

int main() {
    std::vector<std::future<int>> futures;
    for(auto i = 0; i < 4; i++)
        futures.push_back(std::async(&Calculator::add, i, 3));
    for(auto i = 0; i < 4; i++)
        std::cout << futures[i].get() << std::endl;
    return 0;
}

Это компилирует иработает очень хорошо, давая результаты, которые я ожидаю увидеть:

pax> g++ -Wall -Wextra -pthread -std=c++11 -o testprog testprog.cpp
pax> ./testprog
3
4
5
6
...