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

1,00
р.
Заинтересовал такой теоретический вопрос - а как объявить массив лямбд? И можно ли это сделать в принципе? Например, объявляем массив, потом в цикле заполняем его лямбдами, например, с захватом разных параметров, или еще как... Или, скажем, 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 }) /* и т.д. */