Использование асинхронности с std::накопление

#c #concurrency

#c #параллелизм

Вопрос:

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

 #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. std::accumulate — это шаблон. Нет способа определить типы аргументов. Необходимо указать каждый.

Ответ №1:

Поскольку 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,
        amp;std::accumulate<std::vector<int>::const_iterator, int>,
            vec.begin(), vec.end(), 0);
}
  

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

 std::future<int> x = std::async(std::launch::async,
    [amp;]{ return std::accumulate(vec.begin(), vec.end(), 0); });