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

Вопрос задан: 8 месяцев назад Последняя активность: 8 месяцев назад
up 0 down

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

#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'

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

Обновить:

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

1 ответ

up 4 down accepted

Будучи глубоко подозрительными любым кодом с использованием голого 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