Boriska
Помогающий
Offline
|
|
« : 29-04-2023 06:36 » |
|
Привет форумчане. Познакомился в С++ с функтором и предикатом и лямдой С лямдой знаком еще с С#, тут все понятно, но вот зачем были введены функторы и предикаты (тем более что различия как я понял минимальны) ума не приложу. Примеры какие то выхолощенные, по сути объясняют что есть функтор и предикат. Просветите пожалуйста.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #1 : 29-04-2023 07:04 » |
|
Функтор это частный случай переопределения. И насколько я знаю, этот функционал был еше когда мамонты ходили пешком. А нужен он в 2 случаях. 1) Когда лень программисту. Класс заточен под определенную задачу. И каждый раз вызывать его один и тот же метод лень. 2) Когда стороняя функция требует в качестве аргумента функцию. А тебе хочется расширить поведение и учитывать предыдушие вызовы и настройки. Как праило в примерах дают сортировку. Но например это может также и таймеры. Вызов нескольких таймеров с одними теми же настройувми как бы не имеет смысла.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #2 : 29-04-2023 07:16 » |
|
да, переопределение придумали еще при мамонтах, а функторы пойди найди упоминания в печатных изданиях или она обходилась стороной. 1. лень, а какая разниза вызывать a.func() или a(), три символа ? 2. таймер UINT_PTR SetTimer( [in, optional] HWND hWnd, [in] UINT_PTR nIDEvent, [in] UINT uElapse, [in, optional] TIMERPROC lpTimerFunc ); требует указатель. При чем тут функтор. Да и нет в С++ чтобы сторонняя функция требовала функцию. Требует указатель.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #3 : 29-04-2023 07:23 » |
|
Boriska, Не дооценивай лень. Она двигатель прогресса. И человек сделает все, чтобы меньше работать. С таймером. да она требует функцию. Но вспомни примеры с сортировкой. Они также требуют функцию. Но в примерах подсовывают указатель на экземпляр класса с переопределенным оператором ().
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #4 : 29-04-2023 07:33 » |
|
Насчет лени offtop. Когда то очень давно читал расказик на ithappenes. Мужик не признавал GUI. и админил только в консоле. Уволился из организации. И ребятки стали разбирать его наследство. Откапали кучу скриптов. Один из них убил их воображение на повал. Мужику было лень нажимать на кнопки кофемашины и ждать пока она сделает кофе. Он написал скрипт, который соединялся с кофемашиной по сети. И заказывал кофе. Пока он подходил к буффету оффиса, кофе его был готов.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #5 : 29-04-2023 08:07 » |
|
Finch писал Но вспомни примеры с сортировкой. Они также требуют функцию. Но в примерах подсовывают указатель на экземпляр класса с переопределенным оператором () с сортировкой не работал, может я не понимаю, почему если пример требует функцию (указатель на функцию) и передается объект, то будет вызван перегруженный оператор () ?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #6 : 29-04-2023 09:07 » |
|
Потому что, компилятор при линковке понимая, что передан указатель на экземпляр класса будет автоматически сиыковать на operator()/ Если такой не сушествует, будет выдавать ошибку линковки.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 29-04-2023 14:27 » |
|
Boriska, лямбда без захвата умеет конвертироваться к указателю на функцию такого же типа
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #8 : 29-04-2023 14:39 » |
|
Win32 API к C++ не имеет никакого отношения. Даже не смотря на то, что используется компилятор C++.
А лямбда с захватом, неожиданно — функтор. Точнее, это автоматически создаваемая структура, где хранятся копии или ссылки на замыкаемые переменные.
|
|
« Последнее редактирование: 29-04-2023 14:42 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #9 : 30-04-2023 18:04 » |
|
RXL писал Win32 API к C++ не имеет никакого отношения. Даже не смотря на то, что используется компилятор C++. Это к чему ? Я про Win32 API и C++ вопрос не подымал. Лямду С++ по MSDN посмотрел, вроде все понятно, но никакого сходства с функтором не вижу. Да кстати, лямда когда и где появилась первая ?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #10 : 30-04-2023 20:12 » |
|
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #11 : 04-05-2023 17:24 » |
|
Просветите в каком языке лямда появилась первая. Вокруг шарп и javascript, на С++ почти никто не пишет. Ну эти товарищи утверждают что появилось впервые у них. Но если посмотреть то в С11 лямда уже была. С лямдой познакомился в шарпе и здесь был приятно удивлен, что разграничивается передача параметров. Или наши шарписты просто о таком не знали ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 04-05-2023 17:58 » |
|
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #13 : 04-05-2023 18:17 » |
|
Не зацикливайся на сладостях. Лямбда вешь конечно удобная. Но это не самое главное в языке. Когда например дойдеш до шаблонов, поймеш насколько изврашенная логига иногда бывает. А это язык программирования в языке программирования.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #14 : 04-05-2023 18:39 » |
|
Дак шаблоны в любой литературе описаны, тут то вопросов как раз не было, лямда другое дело. А вот кстати нечто подобное LINQ в плюсах было, есть, появилось, планируется ?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #15 : 04-05-2023 18:45 » |
|
Boriska, Они то описаны, только там столько подводных камней, что целая книжка есть по шаблонам. И все равно не до конца познаеш весь дзен.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Люсь
|
|
« Ответ #16 : 19-05-2023 16:58 » |
|
Насчет лени offtop. Когда то очень давно читал расказик на ithappenes. Мужик не признавал GUI. и админил только в консоле. Уволился из организации. И ребятки стали разбирать его наследство. Откапали кучу скриптов. Один из них убил их воображение на повал. Мужику было лень нажимать на кнопки кофемашины и ждать пока она сделает кофе. Он написал скрипт, который соединялся с кофемашиной по сети. И заказывал кофе. Пока он подходил к буффету оффиса, кофе его был готов.
это надо в хиханьки-хаханьки ))
|
|
|
Записан
|
Посторонним просьба не беспокоить! ------------------------------------------------- O (I) Rh +
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #17 : 20-05-2023 04:29 » |
|
Полная версия того расказа. Оригинальный сайт не сохранился. Пришлось искать в веб архиве. xxx: У нас тут YYY (билд инженера) сманили. Чел принципиально жил только в консоли и vim, диаграммы рисовал скриптами в dot, доки писал в wiki маркдауном, если что-либо требовало больше чем 1.5 минуты писал скрипт. Сидим разбираем его наследие. xxx: Из прекрасного xxx: smack-my-bitch-up.sh - шлет видимо его жене "Задержался на работе" и генерит отмазки из списка. Поставлено в cron, стреляет после 9 вечера если на рабочей станции висят интерактивные сессии по ssh с его логином. xxx: kumar-mudak.sh - сканит почту, ищет письма от Кумара (заграничный ДБА с говорящей фамилией) с ключевыми словами (sorry, help и т.д.) откатывает упомянутую базу стейджинга на последний бэкап и отписывается типа не вопрос будь аккуратнее в следующий раз. Зело заколебал его Кумар вестимо. xxx: badun.sh - поставлен на cron на определенные даты, шлет письма "плохо себя чувствую, поработаю из дома" опять же если к 8-45 утра не обнаружилось интерактивных сессий на рабочей станции. xxx: И наконец первый приз: coffe-blyat.sh - ждет 17 сек (!!!) логинится по ssh в кофе-машину (епрст, мы и понятия не имели что она в сетке да и еще что на ней sshd поднят) и засылает туда какую-то абракадабру. Экспериментальным путем выяснили что ЭТО запускает процесс варения half-caf chai latte среднего размера, которое начинает выливаться в чашку как раз к тому моменту когда неспеша идущий человек добирается от его офиса до автомата.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Люсь
|
|
« Ответ #18 : 20-05-2023 08:26 » |
|
|
|
|
Записан
|
Посторонним просьба не беспокоить! ------------------------------------------------- O (I) Rh +
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #19 : 23-05-2023 07:37 » |
|
Вить, меня интересует только один момент: чашку кто ставил?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
RXL
|
|
« Ответ #20 : 23-05-2023 11:08 » |
|
Он сам и ставил. Запускал скрипт, шел до автомата, ставил чашку. 17 секунд, видимо, хватало. Но это еще значит, что автомат должен был быть свободен в эту минуту. Тема коллизий не раскрыта.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #21 : 23-05-2023 18:21 » |
|
Я в инете посмотрел, что такое half-caf chai latte. Если делать по полной программе, то такое автомат явно не будет делать. Если взять укороченный вариант. Это чай - экспрессо - взбитое горячее молоко. Автомат должен взбить и согреть молоко. Заварить черный чай. И сварить экспрессо. Для экспрессо нужно промолоть зерна. правильное экспрессо заваривается около 25 секунд. Давление 9 бар. И температура воды не выше 95 градусов. Так что время подойти есть.
|
|
« Последнее редактирование: 23-05-2023 18:27 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #22 : 23-05-2023 22:00 » |
|
Я думаю, в скриптах должны быть полные блокировки автомата, до подхода "авторизированного пользователя", который особыми манипуляциями на UI мог его разблокировать. Тогда затея имеет смысл. Иначе это может работать только когда в офисе никого нет. зы У нас фирме таких машин штуки 4-5 (и это на и то не всегда человек 20) и всё-равно умудряются очереди устраивать.
|
|
« Последнее редактирование: 23-05-2023 22:07 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|