Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Как объявить массив лямбд

Заинтересовал такой теоретический вопрос - а как объявить массив лямбд? И можно ли это сделать в принципе? Например, объявляем массив, потом в цикле заполняем его лямбдами, например, с захватом разных параметров, или еще как... Или, скажем, vector<...> - как его заполнить лямбдами?
Откровенно говоря, никогда не вдавался в такие детали, auto хватало с головой...


Ответ

Можно воспользоваться шаблоном std::function. Но все лямбды должны быть с одинаковой сигнатурой.
std::vector> lambdas;
lambdas.push_back([](){ return 1; }); lambdas.push_back([](){ return 2; }); /* ... */
Если самому сигнатуру писать лениво, то можно заставить компилятор подставлять её автоматически:
auto lambda1 = [](){ return 1; }; std::vector lambdas;
lambdas.push_back(lambda1 ); lambdas.push_back([](){ return 2; });
Поскольку захват переменных не оказывает влияния на сигнатуру лямбды, то можно заполнить массив вроде бы совершенно разными лямбдами:
int i0, i1;
std::vector> lambdas;
lambdas.push_back([](){ return -1; }); lambdas.push_back([=](){ return i0 + i1; }); lambdas.push_back([i0](){ return i0; }); lambdas.push_back([&i0](){ return i0++; }); lambdas.push_back([&](){ return i0++ + i1++; }); lambdas.push_back([&i0,i1](){ return i0++ + i1; }); /* и т.д. */

Комментариев нет:

Отправить комментарий