Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Все так, но сапиенсы после классов и шаблонов так и не родили ничего радикального нового, что можно было бы без извращений применять в любом классе задач. Из универсального родили в основном мелочи вроде constexpr/consteval, всякие лямбды/сопрограммы довольно специфичны к задачам, а почти все остальное без извращений не работает.
Вот лямбды, на мой взгляд — самое удобное. Теперь пишу на С с лямбдами.
Полиморфизм — почти сразу ушел в топку.
Какое-то время изгалялся с шаблонами для передачи контекста. Но тоже надоел весь этот оверхед.
А лямбды — где не супер-критично время исполнения (а оно в большинстве мест некритично), позволяют всякие удобства с коллбэками.
Например, вместо извратов с итераторами, можно вызывать коллбэк для всех элементов контейнера.
А с вложенными коллбэками можно еще более интересные штуки делать.
Например:
Database* CreateDatabase(std::function<void(std::function<void(Table*,const Val* row_vals)>)>);
//...
CreateDatabase([&](std::function<void(Table*,const Val* row_vals)> cb){
cb(tab0,vals00);
cb(tab1,vals10);
cb(tab0,vals01);
//...
});
Пользователю совершенно не надо париться внутренней структурой Database, он просто вызывает коллбэки в любом порядке для всех записей.
Понятно, что тоже самое можно организовать стандартными средствами С, объявляя кучу глобальных функций — но это неудобно и некрасиво.
Лямбды удобны именно возможностью вставки кода в параметры.