Как использовать основанный на диапазоне цикл for с вектором будущего <T> - PullRequest
1 голос
/ 27 июня 2019

У меня есть программа, которая вычисляет некоторые значения в разных потоках с std::packaged_task<int()>. Я сохраняю std::future, полученную из упакованных задач через get_future() в векторе (определенном как std::vector<std::future<int>>).

Когда я вычисляю сумму всех задач, я использую цикл for, и он работает:

// set up of the tasks
std::vector<std::future<int>> results;
// store the futures in results
// each task execute in its own thread

int sum{ 0 };
for (auto i = 0; i < results.size; ++i) {
    sum += results[i].get();
}

Но я бы лучше использовал цикл for на основе диапазона:

// set up of the tasks
std::vector<std::future<int>> results;
// store the futures in results
// each task execute in its own thread

int sum{ 0 };
for (const auto& result : results) {
    sum += result.get();
}

В настоящее время я получаю ошибку компиляции с помощью clang:

program.cxx:83:16: error: 'this' argument to member function 'get' has type 'const std::function<int>', but function is not marked const

       sum += result.get();
              ^~~~~~
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/future:793:7: note: 'get' declared here

       get()
       ^

Можно ли использовать на основе диапазона для цикла с vector из future<int>?

Ответы [ 2 ]

5 голосов
/ 27 июня 2019

Вам необходимо удалить const из for (const auto& result : results). std::future не предоставляет константную версию get, которую пытается вызвать компилятор, поскольку result является ссылкой на const std::future.

for (auto& result : results) {
    sum += result.get();
}

Делает что хочешь.

4 голосов
/ 27 июня 2019

get не const, поэтому вам нужны неконстантные ссылки:

for (auto& result : results) {
    sum += result.get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...