Уже давно не секрет, что в стандарте языка С++11 ввели такое понятие как лямбда-выражения. Что вы думаете о них и часто ли используете?
Лично мне лямбды нравятся, потому что с их помощью можно не портить архитектуру программы мелкими, не особо часто нужными функциями. Так же с их помощью довольно красиво реализовываются делегаты... Хотя большинство моих знакомых попросту не понимают зачем они нужны...
И, как забавный факт, который я обнаружил... Данный код скомпилируется и даже запустится :
Код
int main() { [](){[](){[](){[](){[](){}();}();}();}();}(); }
Всегда считал, что лямбда-выражения напрочь убивают читабельность большого кода!! (Просто пару раз разбирал сложные программы, в которых любители лямбд пихали их умышленно везде где только можно) Их выгода именно в том, что они содержат несколько строк. А сделать еще одну внятную, читаемую функцию в коде - в этом как раз никаких трудностей нет. На сложном коде лямбды, имхо, только затрудняют чтение и отладку (особенно в чужой разработке, если работаешь в команде, например)!! А пример со скобками конечно сишный на всю голову! Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Лямбда выражения дают возможность захватывать значения локальных переменных, а так же ссылаться на них. KamiRonin, (раз уж "лямбды" сильно засоряют код) покажи пример, меньше 3-4 строк без дополнительных классов, как можно сделать подобное (ниже) без "лямбд".
Здесь важно "шашечки или ехать?". Ведь, семантика приведенного фрагмента - "5+5". С какой целью введена локальная функция?
Инкапсулировать действие внутри функции, сэкономив на именах? Но, ведь, шаблон и инициализатор, все равно, глобальны. Да и ф-ия-оболочка (в данном случае main()) никуда не делась: хочешь новый локальный экземляр, оберни его в глобальную ф-ию, вызывающую его.
С целью создать много похожих ф-ий? Это вполне реализуемо на массивах. Вызывать из одного места разные ф-ии? Для этого есть указатели. Да и макросы никто не отменял.
Так что, только "шашечки". Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
лямбды показывают себя хорошо когда можно обойтись простой функцией. К тому же, поведение OnClick можно динамически менять (и не надо больше с указателями на функции возиться, ведь есть std::function)
Это пример того, как устаревшая парадигма (ООП), помноженная на убожество ОС (плохой интерфейс CUA), заставляет программиста делать ненужную ему фигню (Qt и прочее визуальное "программирование"), которую ему затем искусственно "облегчают" (новые C++)... По мне, запомнить, как пользоваться указателями, гораздо проще, чем запомнить, что они там имеют в виду под суб-/суперклассированием, делегированием и лямбдами...
P.S. И не надо забывать, что лямбды C++ не имеют никакого отношения к настоящим. Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Вторник, 05 Мая 2015, 15:07
Лямбды еще в массивах структур хороши, когда одна и та же функция в одном и том же массиве работает по-разному. А так же хороши при динамичном присвоении их объектам других классов. Едва ли от них есть толк просто ради сокращения размера кода Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы. Как правильно задавать вопросы в технических форумах
vector<int> v = {50, -10, 20, -30}; // sort by absolute value: std::sort(v.begin(), v.end(), [](int a, int b) { return abs(a)<abs(b); });
Отношусь хорошо (как и перегрузке операторов), главное не пересластить этим синтаксическим сахаром. Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
Когда-то в школе проходил. Попробовал, не понравилось. Сколько кодил и со сложными мат примерами, даже косинус не вставлял. Ведь если котелком поварить немного, можно даже обычными + - * / обойтись
Когда-то в школе проходил. Попробовал, не понравилось. Сколько кодил и со сложными мат примерами, даже косинус не вставлял. Ведь если котелком поварить немного, можно даже обычными + - * / обойтись
В 3д играх без Cos и Sin это мазахизм с оскорблением в твой адрес за хреновую оптимизацию в еюдуго прсхлуренц http://gcup.ru/forum/9-44187-1 мой Project 96
На этот раз перехват событий. И при этом код движка более чем понятен и прост Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы. Как правильно задавать вопросы в технических форумах
Сообщение отредактировал Tymonr - Вторник, 05 Мая 2015, 19:31
Лямбды в С++ - это просто синтаксический сахар для функторов (функциональных объектов, объектов с перегруженным operator() (оператор "круглые скобки")). Стало быть применять их можно там же, где и функторы. А функторы - там же, где и указатели на функции. Это все об одном и том же примерно.
1) Первое преимущество функциональных объектов (и лямбд) в том, что у них есть состояние (хотя чистые функциональные языки считают изменяемое состояние недостатком, но у них вообще другая парадигма, другие проблемы и другие решения для них).
while (c()) { std::cout << "Hello lambda" << std::endl; }
2) Лямбды анонимны и не засоряют пространство имен. Если нужно куда-то передать функцию/функтор, иногда нет смысла давать ей имя, если она всего один раз используется. Тут уже приводили пример:
ЦитатаSaitei ()
std::sort(v.begin(), v.end(), [](auto a, auto b) { return abs(a)<abs(b); });
3) Лямбды можно куда-то передавать, добавлять в какие-то контейнеры, передавать обработчикам, которые будут выполнять их в другом потоке. Например, есть какой-то обработчик SQL-запросов, куда из разных потоков отправляются запросы, а он их выполняет последовательно, предотвращая коллизии.
4) Лямбды могут синтаксически замыкать контекст. Например можно взять по ссылке переменную из окружения двух лямбд и использовать ее как разделяемую память. А сами лямбды передать обработчику для асинхронного выполнения. Тогда следующая лямбда может понять, выполнилась ли первая и использовать ее результат.
Код
int result = 0; sequencer->addTask( [&result, this]() { result = doSomething(); }); sequencer->addTask( [&result, this]() { if (result) { // everything is ok, we can process result } });
Лямбды в С++ - это просто синтаксический сахар для функторов (функциональных объектов, объектов с перегруженным operator() (оператор "круглые скобки")). Стало быть применять их можно там же, где и функторы.
Можно, а не нужно. Когда итак понятно в контексте когда, что это лямды - зачем писать что-то лишнее? Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы. Как правильно задавать вопросы в технических форумах
В дельфи такой фигни нет к счастью) Чет чем дальше тем более геморойным делают сишный синтаксис. Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
В дельфи такой фигни нет к счастью) Чет чем дальше тем более геморойным делают сишный синтаксис.
Гемороя это не добавит, т.к это просто новая фишка в новом стандарте и ты сам решаешь будешь или нет ей пользоваться в еюдуго прсхлуренц http://gcup.ru/forum/9-44187-1 мой Project 96
Гемороя это не добавит, т.к это просто новая фишка в новом стандарте и ты сам решаешь будешь или нет ей пользоваться
Добавит если кто то захочет поизвращаться с этой новой фишкой, а тебе придется разбираться в его коде. Да и я не только про лямблы. Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)