Заинтересовал такой теоретический вопрос - а как объявить массив лямбд? И можно ли это сделать в принципе? Например, объявляем массив, потом в цикле заполняем его лямбдами, например, с захватом разных параметров, или еще как... Или, скажем, vector<...> - как его заполнить лямбдами?
Откровенно говоря, никогда не вдавался в такие детали, auto хватало с головой...
Ответ
Можно воспользоваться шаблоном std::function. Но все лямбды должны быть с одинаковой сигнатурой.
std::vector
lambdas.push_back([](){ return 1; });
lambdas.push_back([](){ return 2; });
/* ... */
Если самому сигнатуру писать лениво, то можно заставить компилятор подставлять её автоматически:
auto lambda1 = [](){ return 1; };
std::vector
lambdas.push_back(lambda1 );
lambdas.push_back([](){ return 2; });
Поскольку захват переменных не оказывает влияния на сигнатуру лямбды, то можно заполнить массив вроде бы совершенно разными лямбдами:
int i0, i1;
std::vector
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; });
/* и т.д. */
Комментариев нет:
Отправить комментарий