Как передавать в лямбду 2 и более значений?

Рейтинг: 1Ответов: 2Опубликовано: 04.05.2015

Есть такой код:

auto q_future = QtConcurrent::map(vector, [this](int& number)
                              {
                                  doTask(number);
                              });

watcher.setFuture(q_future);

Как передать в метод doTask больше значений?
Например, значение QString name?

Ответы

▲ 1Принят

Видимо так

QString name;
auto q_future = QtConcurrent::map(vector, [this, name](int& number)
                              {
                                  doTask(number, name);
                              });

Или [=]. Или по ссылке - [this, &name]

▲ 2

Из вопроса неясно, почему дополнительные значения нельзя передать через членопеременные объекта, указатель на который и так уже передаётся в лямбду. Но допустим, что нельзя...

В этом случае можно захватить лямбдой любую локальную переменную, прямо указав её имя в списке захватываемых переменных.

#include <iostream>
#include <random>
#include <QtConcurrent/QtConcurrentMap>
using namespace std;

struct RandomIncrementor
{
    RandomIncrementor()
        : _engine(_device()), _distribution(0, 9)
    { }

    void surpriseMeNotLessThen(vector<int>& vector, int min)
    {
        QtConcurrent::map(vector,
            [this, min](int& number) { doTask(number, min); }
        ).waitForFinished();
    }

private:
    random_device                 _device;
    default_random_engine         _engine;
    uniform_int_distribution<int> _distribution;

    void doTask(int& number, int min) {
        number += min + _distribution(_engine);
    }
};

int main()
{
    vector<int> vector = { 1, 2, 3, 4, 5 };

    RandomIncrementor incrementor;
    incrementor.surpriseMeNotLessThen(vector, 5);

    for (auto it = begin(vector); it != end(vector); ++it) {
        if (it != begin(vector)) cout << " ";
        cout << *it;
    }
    cout << endl;

    return 0;
}