Четверг, 28 Марта 2024, 11:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » C/C++ » Как вы относитесь к лямбда-выражениям?
Как вы относитесь к лямбда-выражениям?
SaiteiДата: Вторник, 05 Мая 2015, 07:33 | Сообщение # 1
старожил
Сейчас нет на сайте
Уже давно не секрет, что в стандарте языка С++11 ввели такое понятие как лямбда-выражения. Что вы думаете о них и часто ли используете?

Лично мне лямбды нравятся, потому что с их помощью можно не портить архитектуру программы мелкими, не особо часто нужными функциями. Так же с их помощью довольно красиво реализовываются делегаты... Хотя большинство моих знакомых попросту не понимают зачем они нужны...

И, как забавный факт, который я обнаружил... Данный код скомпилируется и даже запустится biggrin :
Код
int main() { [](){[](){[](){[](){[](){}();}();}();}();}(); }

Смысла от него, правда, не очень много... =)
KamiRoninДата: Вторник, 05 Мая 2015, 07:59 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Всегда считал, что лямбда-выражения напрочь убивают читабельность большого кода!! (Просто пару раз разбирал сложные программы, в которых любители лямбд пихали их умышленно везде где только можно)
Их выгода именно в том, что они содержат несколько строк. А сделать еще одну внятную, читаемую функцию в коде - в этом как раз никаких трудностей нет. На сложном коде лямбды, имхо, только затрудняют чтение и отладку (особенно в чужой разработке, если работаешь в команде, например)!!
А пример со скобками конечно сишный на всю голову! biggrin


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
_morglodДата: Вторник, 05 Мая 2015, 08:38 | Сообщение # 3
уже был
Сейчас нет на сайте
Лямбда выражения дают возможность захватывать значения локальных переменных, а так же ссылаться на них.
KamiRonin, (раз уж "лямбды" сильно засоряют код) покажи пример, меньше 3-4 строк без дополнительных классов, как можно сделать подобное (ниже) без "лямбд".

Код:
Цитата Saitei ()
И, как забавный факт, который я обнаружил...

Почти корректный код, почти всегда скомпилируется и запустится.


Сообщение отредактировал _morglod - Вторник, 05 Мая 2015, 08:39
GudleifrДата: Вторник, 05 Мая 2015, 10:08 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата _morglod ()
как можно сделать подобное (ниже) без "лямбд".


Здесь важно "шашечки или ехать?".
Ведь, семантика приведенного фрагмента - "5+5".
С какой целью введена локальная функция?

Инкапсулировать действие внутри функции, сэкономив на именах? Но, ведь, шаблон и инициализатор, все равно, глобальны. Да и ф-ия-оболочка (в данном случае main()) никуда не делась: хочешь новый локальный экземляр, оберни его в глобальную ф-ию, вызывающую его.

С целью создать много похожих ф-ий? Это вполне реализуемо на массивах.
Вызывать из одного места разные ф-ии? Для этого есть указатели.
Да и макросы никто не отменял.

Так что, только "шашечки".


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
SaiteiДата: Вторник, 05 Мая 2015, 14:20 | Сообщение # 5
старожил
Сейчас нет на сайте
KamiRonin, Gudleifr, ну не знаю. В подобных ситуациях
Код
this->OnClick([](){ std::cout<<"Don't touch me!"<<std::endl; });

лямбды показывают себя хорошо когда можно обойтись простой функцией. К тому же, поведение OnClick можно динамически менять (и не надо больше с указателями на функции возиться, ведь есть std::function)
GudleifrДата: Вторник, 05 Мая 2015, 14:56 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата Saitei ()
В подобных ситуациях
Это пример того, как устаревшая парадигма (ООП), помноженная на убожество ОС (плохой интерфейс CUA), заставляет программиста делать ненужную ему фигню (Qt и прочее визуальное "программирование"), которую ему затем искусственно "облегчают" (новые C++)...
По мне, запомнить, как пользоваться указателями, гораздо проще, чем запомнить, что они там имеют в виду под суб-/суперклассированием, делегированием и лямбдами...

P.S. И не надо забывать, что лямбды C++ не имеют никакого отношения к настоящим.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Вторник, 05 Мая 2015, 15:07
TymonrДата: Вторник, 05 Мая 2015, 15:18 | Сообщение # 7
With OpenSource forever
Сейчас нет на сайте
Лямбды еще в массивах структур хороши, когда одна и та же функция в одном и том же массиве работает по-разному.
А так же хороши при динамичном присвоении их объектам других классов. Едва ли от них есть толк просто ради сокращения размера кода


Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах
OpenGOOДата: Вторник, 05 Мая 2015, 15:29 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
У Страуструпа есть хороший пример использования
Код
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)

[GameMaker: Studio v1.4.9999]
wcptДата: Вторник, 05 Мая 2015, 15:46 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
как приятно видеть уважаемых экспертов в теме! up
SaiteiДата: Вторник, 05 Мая 2015, 15:54 | Сообщение # 10
старожил
Сейчас нет на сайте
Цитата OpenGOO ()
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); });

Более того, в С++14 можно сделать так:
Код
std::sort(v.begin(), v.end(), [](auto a, auto b) { return abs(a)<abs(b); });
FirstДата: Вторник, 05 Мая 2015, 16:10 | Сообщение # 11
Уолтер Брайт
Сейчас нет на сайте
Цитата Saitei ()
Как вы относитесь к лямбда-выражениям?

Когда-то в школе проходил. Попробовал, не понравилось. Сколько кодил и со сложными мат примерами, даже косинус не вставлял. Ведь если котелком поварить немного, можно даже обычными + - * / обойтись
PoidetLiДата: Вторник, 05 Мая 2015, 18:42 | Сообщение # 12
участник
Сейчас нет на сайте
Цитата First ()
Когда-то в школе проходил. Попробовал, не понравилось. Сколько кодил и со сложными мат примерами, даже косинус не вставлял. Ведь если котелком поварить немного, можно даже обычными + - * / обойтись

В 3д играх без Cos и Sin это мазахизм с оскорблением в твой адрес за хреновую оптимизацию


в еюдуго прсхлуренц
http://gcup.ru/forum/9-44187-1 мой Project 96
berilДата: Вторник, 05 Мая 2015, 18:46 | Сообщение # 13
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата KamiRonin ()
Всегда считал, что лямбда-выражения напрочь убивают читабельность большого кода

Согласен. Если один пишешь и никто кроме тебя в нем разбираться не будет тогда да.




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
TymonrДата: Вторник, 05 Мая 2015, 19:29 | Сообщение # 14
With OpenSource forever
Сейчас нет на сайте
Цитата PoidetLi ()
В 3д играх без Cos и Sin

В 2д тож самое) только одним измерением меньше
Цитата beril ()
Согласен. Если один пишешь и никто кроме тебя в нем разбираться не будет тогда да.

Вот тоже не обязательно, совсем. Опять же, конструкция типа:
Код
typedef struct _Controller{
   const char *test_name;
   std::function<TestScene*()> callback;
} Controller;

Controller g_aTestNames[] = {
   { "ActionManager", [](){return new ActionManagerTestScene(); } },
   { "Actions - Basic", [](){ return new ActionsTestScene(); } },
   { "Actions - Ease", [](){return new ActionsEaseTestScene();} },
   { "Actions - Progress", [](){return new ProgressActionsTestScene(); } },
          { "Allocator - Basic", [](){return new AllocatorTestNS::AllocatorTestScene(); } },
          { "Audio - CocosDenshion", []() { return new CocosDenshionTestScene(); } } };


Очень удобная реализация тестового меню в Cocos2d(ХЗ тока, зачем они скобки круглые ставят после каждых квадратных, но не убирать же их самому счас)

Или

Код
listener1->onTouchBegan = [](Touch* touch, Event* event){}

На этот раз перехват событий.
И при этом код движка более чем понятен и прост


Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах


Сообщение отредактировал Tymonr - Вторник, 05 Мая 2015, 19:31
JhonДата: Четверг, 07 Мая 2015, 23:56 | Сообщение # 15
частый гость
Сейчас нет на сайте
Лямбды в С++ - это просто синтаксический сахар для функторов (функциональных объектов, объектов с перегруженным operator() (оператор "круглые скобки")). Стало быть применять их можно там же, где и функторы. А функторы - там же, где и указатели на функции. Это все об одном и том же примерно.

1) Первое преимущество функциональных объектов (и лямбд) в том, что у них есть состояние (хотя чистые функциональные языки считают изменяемое состояние недостатком, но у них вообще другая парадигма, другие проблемы и другие решения для них).

Например:
Код
auto getCounter = [](int initialValue) {
     return [initialValue]() mutable {
         return initialValue--;
     };
};

auto c = getCounter(5);

while (c()) {
     std::cout << "Hello lambda" << std::endl;
}


Это эквивалентно созданию функтора:
Код
class Counter {
     int m_state;
public:
     Counter(int initialValue) : m_state(initialValue) {}
     int operator()() {
         return m_state--;
     }
};

Counter getCounter(int initialValue) {
     return Counter(initialValue);
}

Counter c = getCounter(5);

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
     }
});
TymonrДата: Пятница, 08 Мая 2015, 03:27 | Сообщение # 16
With OpenSource forever
Сейчас нет на сайте
Цитата Jhon ()
Лямбды в С++ - это просто синтаксический сахар для функторов (функциональных объектов, объектов с перегруженным operator() (оператор "круглые скобки")). Стало быть применять их можно там же, где и функторы.

Можно, а не нужно. Когда итак понятно в контексте когда, что это лямды - зачем писать что-то лишнее?


Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах
OrdanДата: Пятница, 08 Мая 2015, 03:49 | Сообщение # 17
Главный зомби
Сейчас нет на сайте
В дельфи такой фигни нет к счастью) Чет чем дальше тем более геморойным делают сишный синтаксис.

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
PoidetLiДата: Пятница, 08 Мая 2015, 04:20 | Сообщение # 18
участник
Сейчас нет на сайте
Цитата Ordan ()
В дельфи такой фигни нет к счастью) Чет чем дальше тем более геморойным делают сишный синтаксис.

Гемороя это не добавит, т.к это просто новая фишка в новом стандарте и ты сам решаешь будешь или нет ей пользоваться


в еюдуго прсхлуренц
http://gcup.ru/forum/9-44187-1 мой Project 96
OrdanДата: Пятница, 08 Мая 2015, 04:22 | Сообщение # 19
Главный зомби
Сейчас нет на сайте
Цитата PoidetLi ()
Гемороя это не добавит, т.к это просто новая фишка в новом стандарте и ты сам решаешь будешь или нет ей пользоваться

Добавит если кто то захочет поизвращаться с этой новой фишкой, а тебе придется разбираться в его коде. Да и я не только про лямблы.


Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
PoidetLiДата: Пятница, 08 Мая 2015, 04:31 | Сообщение # 20
участник
Сейчас нет на сайте
Цитата Ordan ()
Добавит если кто то захочет поизвращаться с этой новой фишкой, а тебе придется разбираться в его коде. Да и я не только про лямблы.

ну лямблы не самая трудная фишка. за время выпивание одного стакана чая, разобрался


в еюдуго прсхлуренц
http://gcup.ru/forum/9-44187-1 мой Project 96
Форум игроделов » Программирование » C/C++ » Как вы относитесь к лямбда-выражениям?
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг