Использование асинхронного с std :: накапливать - PullRequest
3 голосов
/ 17 марта 2019

Я думал, что это будет проще, но, попробовав много вариантов ниже, я не могу заставить этот код скомпилировать

#include <thread>
#include <algorithm>
#include <future>

int main()
{
    std::vector<int> vec(1000000, 0);
    std::future<int> x = std::async(std::launch::async, std::accumulate, vec.begin(), vec.end(), 0);
}

error: no matching function for call to 'async(std::launch, <unresolved overloaded function type>, std::vector<int>::iterator, std::vector<int>::iterator, int)'

Чего мне не хватает?

1 Ответ

4 голосов
/ 17 марта 2019

Поскольку std::accumulate - это шаблон, вы должны предоставить параметры шаблона (чтобы разрешить его для определенной функции), прежде чем получить его адрес.

#include <thread>
#include <algorithm>
#include <future>
#include <vector>
#include <numeric>

int main()
{
    std::vector<int> vec(1000000, 0);

    std::future<int> x = std::async(std::launch::async,
        &std::accumulate<std::vector<int>::const_iterator, int>,
            vec.begin(), vec.end(), 0);
}

Это что-то вроде гадости, так что вместо этого вы можете использовать лямбду:

std::future<int> x = std::async(std::launch::async,
    [&]{ return std::accumulate(vec.begin(), vec.end(), 0); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...