Еще я мальчиком все думал: заведу себе зверька,
а то их вон сколько скачет по полям-то.
Возьму в товарищи разумного жирафа, муравьеда
или просто кенгуру, я даже имя подыскал.
Лямбда! Я назову его Лямбда! —
Так думал я, но детство кончилось, а бедный муравьед
и по сегодня остается невостребован
и скачет, где скакал!
А правда, что модные программисты больше не используют олдс-кульную конструкцию вида:
do{ if (..) continue; } while(false);
а заменили её на лямбду:
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
std::string str = "fdsa";
int n = -1;
[&]()
{
if ( str == "asdf" )
{
std::cout << 1 << std::endl;
n = 1;
return;
}
if ( str == "fdsa" )
{
std::cout << 2 << std::endl;
n = 2;
return;
}
n = 0;
std::cout << "unknown" << std::endl;
}();
std::cout << "n=" << n << std::endl;
return 0;
}
Здравствуйте, Qbit86, Вы писали:
BFE>>А правда, что модные программисты больше не используют олдс-кульную конструкцию вида Q>http://rsdn.ru/forum/cpp.applied/6336533
Здравствуйте, antropolog, Вы писали:
A>меня бесит неконстантность n и str в этом примере.
Смысл как раз в том, что n — не константа. Вместо n может быть любой объект или множество объектов, переменных. Например, это может быть структура заполняемая по результатам разбора XML...
Здравствуйте, _hum_, Вы писали:
__>Здравствуйте, se_sss, Вы писали:
_>>Мои ощущения от лямбд примерно соответствуют описаниям ужасов goto. _>>Только goto локальны, а лямбды соответствуют глобальным прыжкам.
__>вы что-то путаете. лямбды дабт возможность только локальных прыжков (в пределах тела лямбды), тогда как goto -куда хочешь
Не путаю. Это ощущения.
От того, что я внезапно оказываюсь в теле функции, в которой я на самом деле не нахожусь, но зато там расположено тело лямбды.
И кстати, goto — именно локален (в пределах функции). Для глобальных переходов есть setjump() longjump(). Не приходилось пользоваться
Здравствуйте, se_sss, Вы писали:
_>Здравствуйте, _hum_, Вы писали:
__>>Здравствуйте, se_sss, Вы писали:
_>>>Мои ощущения от лямбд примерно соответствуют описаниям ужасов goto. _>>>Только goto локальны, а лямбды соответствуют глобальным прыжкам.
__>>вы что-то путаете. лямбды дабт возможность только локальных прыжков (в пределах тела лямбды), тогда как goto -куда хочешь
_>И кстати, goto — именно локален (в пределах функции).
хм.. действительно, по документации только в пределах функции, хотя помню, баловался с ним, и получил перескок с тела одной функции в тело другой. но это, может, глюк компилятора.
тогда да, вопрос — чем плох goto?
Ответ прост: до цикла вписать строку [&](){, в точке выхода написать return, а месте выхода закрыть открытую скобку с помощью строки }(); вот так: BFE>
Здравствуйте, dr. Acula, Вы писали:
BFE>>Такой код сложнее читать и он потенциально менее эффективен. DA>Решил посоревноваться в оптимизациях с компилятором?
BFE>А ещё можно исключение подбросить и поймать BFE>Такой код сложнее читать и он потенциально менее эффективен.
этот код наоборот в явном виде прописывает намерения программиста — что будет идти поиск до той поры, пока что-то не будет найдено. то есть, на первое место ставится логика, а не техника (может, и в ущерб производительноси, хотя в данном случае бабушка надвое сказала). к тому же струтурированность (отсутствие прыжков) помогает легко понять, когда и куда будет происходить выход.
upd. кстати, в качестве принципиального отличия выхода по флагу от выхода по прыжку можно рассматривать отсутствие у первого гарантии того, что если в каком-то месте стоит код bFound = true, то цикл будет прерван (в отличие от return, break)
BFE>Такой код сложнее читать и он потенциально менее эффективен.
брось ты, у меня тоже вокруг колеги кругом лямбду пихают, просто надо прямо сказать повыделыватся.
есть случаи когда лямда позволяет написать изящный и короткий код, но пока ни ты никто другой этих случаев тут не приводил.
BFE>нет. В данном вопросе мне важнее удобство чтения.
так нету его особого удобства то, спор на пустом месте, прямая логика всёещё быстрее читается.
возможно через год два три четыре пять появятся программисты которые без лямды код вообще не понимают,
но я лично считаю с этим надо боротся и без необходимости её не применять. по крайней мере я режу успешо
во всех ревьюв бесполезные лямбды