std::function | Полиморфная обёртка функции | Изучение С++ для начинающих. Урок
ฝัง
- เผยแพร่เมื่อ 29 ธ.ค. 2024
- Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)
✅Указатель на функцию в качестве параметра. Передача функции в качестве параметра. С++ Урок #65
bit.ly/2s1qndK
✅Цикл foreach C++ | range-based циклы | Изучение С++ для начинающих. Урок #137
bit.ly/2IGexQu
✅Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут!=)
✅ www.donationale...
✅ Telegram канал t.me/SergeySim...
Уроки по программированию
✅Наша группа ВК smplcode
✅Подписывайтесь на канал / @simplecodeit
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
Масив функций! Ура, мечта сбылась!
Да, вещь прикольная, спору нет, но как оно будет компилироваться на avr8 например? Я раньше массив указателей на функции ручками, ручками писал. 😅
А если union или variant использовать, то массив функций с разными типами и сигнатурами можно будет использовать.
Спасибо! Уроки по С++ на ютубе одни из лучших!
ЭТО САМОЕ ИМБОВОЕ ЧТО Я ВИДЕЛ В СВОЕЙ ЖИЗНИ, СПАСИБО СЕРГЕЙ!!!
Отличные уроки на логику!!!
И не важно программист вы или нет, или даже и не собираетесь быть программистом.
Автору огромное спасибо и пожалуйста продолжайте!
Артём, спасибо тебе большое! Как коллега по языку - ты один из нас, профессионалов. Везде даю ссылку на твои занятия как эталон. Ты - лучший!
Сергей очередной раз спасибо за ваши шикарные труды, вы топ!
#stdfunction #SimpleCode #урокипрограммирования
Вы замечательный! Потрясающее изложение материала!
Спасибо за урок, как всегда!
Очень полезный инструмент этот function. Спасибо огромное. C++ - это дебри, но это классно)
Спасибо за бесценный труд!
Интересный урок, спасибо Сергей!
Супер интересно, как всегда! спасибо
Огромное спасибо. Очень жду подробно про лямбды
Один из важнейших уроков. Спасибо Сергей! Просим продолжения по С++.
Спасибо за урок!
Спасибо за интересный урок!)
Очень годно и так понятно опять! Я даже и не думал пока, что такие вещи изучать а теперь знаю! Спасибо! Жду следующего урока.
Большое спасибо!
блестящее объяснение!
спасибо за вашу работу
Великолепно, массив функций!
Лучшие уроки по C++
Спасибо,Сергей, вы лучший!
Очень хороший урок! Вообще канал просто супер! Каждое видео - все по делу, никакой воды!
Если будет возможность, сделайте видео по boost::bind в связке с boost::asio. Очень не хватает хорошего понятного материала по этой теме
Это требует много практики. Продолжаю удивляться возможностям плюсов
Желаю тебе много-много подписчиков, спасибо за уроки!
хорошее объяснение. спасибо
урок супер ,давно ждал его
Спасибо за урок.
После "указателей на функции" смотрю это, чтобы понять что же такое лямбда функции). Спасибо вам за уроки
Классный урок, очень интересно.
Спасибо!
спасибо тебе друг, наконец-то кто то мне объяснил что такое фунтуры, теперь пойду смотреть лямбду
Как всегда на высоте! В том же духе!
благадарачка. Как всегда.
очень интересно, спасибо!
Спасибо)
Боже, как это круто
просто охренеть как круто
Отличные уроки , на ютюбе только основы , а у тебя все мелочи и это помогает развиваться .Вопрос будет ли оьучение c# или python?
c# будет, точно когда не скажу.
Круто!!!
Офигеть!!!! Спасибо!!!Лайк и подписка!!!!!
v top!
круто!
спасибо
Incredible! Real Brainiac ahah
поскорее бы видио урок про лямбды
Таки чем же отличается std::function от обычного указателя на функцию?
std::function - класс, указатель на функцию - указатель на функцию
В С++ функции и указатели на функции имеют свой четкий тип, так void foo(int i) имеет тип "функция принимающая 1 аргумент целочисленного значения и возвращающая пустоту". Указатель на нее будет иметь тип "указатель на ф-ю ... (см. выше)". Если рассматривать методы класса (для примера взят метод класса А), то их тип - "функция класса А, принимающая 1 аргумент ... (см. выше)" - совершенно другой тип, указатель на нее - "указатель на функцию класса А ... (см. выше)". В связи с этим, ранее описанный указатель на глобальную ф-ю не может указывать на метод класса А, так же как и указатель на метод класса А не может указывать на глобальную функцию, ведь их типы совершенно разные. Аналогичная ситуация происходит с использованием указателя на метод класса, когда у нас есть несколько классов, ведь void foo(int i) из класса А и void foo(int i) из класса В будут иметь разные типы. std::function же позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной.
@@hvac_vdk Объект типа std::function может содержать не только непосредственно указатель на функцию, но и указатель на "функциональный объект", т.е. объект некоторого класса, для которого переопределен operator() - оператор круглых скобок. В таком случае синтаксис вызова этого переопределенного оператора у объекта будет совпадать с синтаксисом вызова обычной функции.
@@defined_user чётко объяснил! Спасибо!!
@@defined_user Указатель на функцию также "позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной".
То есть, нет никакой разницы в использовании между указателем на функцию и шаблоном std::function во всех случаях указанных в предыдущем коментарии, кроме случая с "функциональным объектом".
Потный урок , но интересный !
А теперь ДЗ: сделать так что бы результаты двух функций вывродились отдельно друг от друга, тоесть вначале БАР потом ФОО (разделённые бекспейсом)
местами поменять foreach с числами и foreach с функциями (в теле foreach с функциями будет foreach с числами в теле которого будет fel(el); )
thanks, what is the difference between std::function and lambdas?
Подскажите, разве нельзя передавать указатель на массив указателей на функции? В чем преимущество именно std::functional ?
defined_user:
В С++ функции и указатели на функции имеют свой четкий тип, так void foo(int i) имеет тип "функция принимающая 1 аргумент целочисленного значения и возвращающая пустоту". Указатель на нее будет иметь тип "указатель на ф-ю ... (см. выше)". Если рассматривать методы класса (для примера взят метод класса А), то их тип - "функция класса А, принимающая 1 аргумент ... (см. выше)" - совершенно другой тип, указатель на нее - "указатель на функцию класса А ... (см. выше)". В связи с этим, ранее описанный указатель на глобальную ф-ю не может указывать на метод класса А, так же как и указатель на метод класса А не может указывать на глобальную функцию, ведь их типы совершенно разные. Аналогичная ситуация происходит с использованием указателя на метод класса, когда у нас есть несколько классов, ведь void foo(int i) из класса А и void foo(int i) из класса В будут иметь разные типы. std::function же позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной.
Здравствуйте! Как создать массив из функций с разными сигнатурами? (если это вообще возможно)
я так понял, что function это делегат типа func в с#, который прекрасно кушает лямбда выражения, например в методах LINQ, а указатель на функцию это простой делегат из с# который может хранить ссылки на различные функции и использоваться как объект
Немного не понимаю, зачем это нужно, если вместо класса function можно использовать typedef и указатель на функцию
typedef void(*FUNC)(int)
Результат будет таким же, просто реализация без сторонних инклудов
или я ошибаюсь?
Именно такая сигнатура используется и поддерживается в STL
17:45, почему по ссылке?
потому что нам не надо менять значения.
@@ДмитрийНормов-ю6ц, передача данных по ссылке как раз и позволяет менять значение
@@guiterenzog2723 , ага. Ну и экономия памяти...
А можно ли осуществить перегрузку таких функций разными сигнатурами объекта std::function?
можно, поскольку в перегрузке будет конкретное инстанцирование шаблона std::function, т. е. свой тип.
А кто говорил, что будет легко? Концентрация знаний из прошлых уроков. Вроде бы понял всё при помощи отладчика, но нужен опыт, чтобы прям вникнуть и не сомневаться.
Вопрос: незя в функции do вставить 2 функции эти а не через vector передавать?
Это как обобщение в Си шарп. Видимо в обоих языках эти фигурные скобки используются одинаково. И Вектор тоже использует это обобщение.
шаблоны?(templates)
@@roflkek6901 да
Здравствуйте, только что нашла ваш канал, так что заранее прошу прощения, если вы уже затрагивали эти вопросы. Подскажите, пожалуйста, при написании на с++ в visual studio 2017 или code blocks какая версия языка идёт по умолчанию, т е как понять на какой версии языка я пишу?
Спасибо!
а зачем это нужно если есть указатели на функцию?
👍🏽
как описать сигнатуру метода класса?
объектная сущность-обертка функции Foo
Только не понял почему при втором переборе используется ссылка на элементы.
void Perebor(vector &v, vector fuVect)
{
for (auto el : v)
{
for (auto &fEl : fuVect)
{
fEl(el);
}
}
}
Скорее всего, это для оптимизации. Чтобы копия функции не создавалась и не занимала лишнего места.
Там она (ссылка) и для первого элемента используется. Только не понятно почему для первого вектора прием по ссылке объявлен в объявлении переменных функции. а для второго не там же, а в объявлении цикла.
В общем и так и так работает и вообще не по ссылке тоже все работает. Без разницы.
Все же в чем отличие от указателя на функцию? Просто удобная обертка?
Извините, а не легче ли просто добавить условие в функции бар и фу, мол если не четное, вызывается бар к примеру? Хотя возможно массив функций уместен при большом их кол- ве, но я в этом опыта не имею. По поводу того что постоянно придётся менять эти 2 поля, ну и что, зато не нужны будут никакие массивы функций. И программа будет проще и меньше ресурсов займёт.
Чё-то я так и не понял, в чем преимущество объектов function, над указателями на функции?..
Есть ли отличие от указателей на функцию?
Как я подразумеваю, указатель на функцию хранит в себе адрес функции. Объект function уже хранит в себе непосредственно саму функцию. Различия соответственно в скорости доступа и занимаемой памяти, если я всё правильно понял.
урок #0, 1лям просмотров
#142, 17к просмотров
Так это же с# делегат.
Очень похоже
С указателями на функцию меньше затрат.
Прошу прощения, не могли бы вы мне помочь?
Я очень бы хотел начать осваивать оконное программирование, но только вот не знаю с чего начать и что выбрать (WINAPI, MFC, CLR). Как лучше начинать изучать его?
Во первых, стоит ли остановится на средствах языка С++ или уже намного лучше программировать с С#, Java?
Во вторых, я бы хотел изучить оконное программирования не на уровне, как в редакторе набросать кнопочек, а более глубоко, где мне искать ресурсы, ибо перечитывать документацию майкрософт, я думаю будет неэффективно.
Используй визуал студию или Qt. Там нет ничего сложного в создании оконного проекта. Вин апи он сложнее на мой взгляд. Там без документации некуда, читай на МСДН как работает функция и методы и вперед. Изучив С++ тебе потом не составит никакого труда перейти на с# и ява. Зато ты в полной мере поймешь что такое наследование , полиморфизм и инкапсуляция. И с паттернами более лучше разберешься. Еще плюс С++ в том что он строго типизированный язык, и имеет более низкий уровень, можешь так же и с железом работать. Еще его плюс в том, что он более мощный и гибкий(лично мое мнение), да все самое топовое пишется в основном на нем. Какой нибудь Асасинс Крид или Крайзис не сделать с применением явы, с# что то более ли мение близкое еще можно, и то скорее всего сам движек будет написан на с++, а сама реализация игры уже на шарпе. Про Pyton, вообще отдельный разговор. Одни эти отступы задолбут, код съедит вправо что потом хрен свой код сам поймешь. Он проще, но в тоже время и убогий. На нем хорошо писать нейросеть и для вэб разроботки. Я лично разбирался так. Нашел инструкцию как создать вин приложение в визуал. Оно было не вин апи, там использовался почти чистый с++. Взял за образец другую программу и пытался тупо ее скопировать. Накидал кнопок и т.д. и писал свою реализацию к ним. А вин апи в первые пришлось использовать когда писал взлом к игре. Свой инжектор. Как бы немного подсмотрел другие реализации в интернете. Взял от туда методы, зашел на МСДН. Читал как сделать снимки системы, найти процесс, хендлы и тд. Поставь для себя конкретную задачу, написать что то. Сделай план на бумаге - если в голове все удержать не можешь. А потом гугли как решить то или иное, конкретно из твоей задачи. И методом проб и ошибок ты добъешься результата. Поймешь работу, синтаксис и тд.
@@iii-mk7no Есть ли смысл идти работать стажером C++, если планируешь потом осваивать другой язык программирования (C#)? И как понять, что у меня достаточно знаний?
@@МаксимРебянов Все языки программирования они С подобные. (думаю только асемблер небольшое исключение из правил. Там больше на машинный код похоже) . А так освоив С++ вы сможете в полной мере насладится ООП, понять весь смысл парадигм, понять что такое типы данных(строго типизированный язык) и т.д. Я периодически пишу на Pyton. После С++ это как задачи первого класса решать. А С# он практически тот же С++, только немного облегченный для программиста. Добавили сборщиков мусора и других вещей о чем нужно было думать в С++. Если у тебя есть возможность влезть в эту сферу и тем более в С++, даже не сомневайся. С него ты вольешься в другие языки. А вот если с пайтона в с++ уже будет труднее.
Лично я не понял преимущества functional я могу так же сделать все.Получается на 2-3 стр больше,но при этом я голову не ломаю
defined_user:
В С++ функции и указатели на функции имеют свой четкий тип, так void foo(int i) имеет тип "функция принимающая 1 аргумент целочисленного значения и возвращающая пустоту". Указатель на нее будет иметь тип "указатель на ф-ю ... (см. выше)". Если рассматривать методы класса (для примера взят метод класса А), то их тип - "функция класса А, принимающая 1 аргумент ... (см. выше)" - совершенно другой тип, указатель на нее - "указатель на функцию класса А ... (см. выше)". В связи с этим, ранее описанный указатель на глобальную ф-ю не может указывать на метод класса А, так же как и указатель на метод класса А не может указывать на глобальную функцию, ведь их типы совершенно разные. Аналогичная ситуация происходит с использованием указателя на метод класса, когда у нас есть несколько классов, ведь void foo(int i) из класса А и void foo(int i) из класса В будут иметь разные типы. std::function же позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной.
Вот здесь у меня сломалась голова.
почему функция Baz отработала быстрее всех ? это из - за того что мы туда ничего не передали ? никакой логики помимо cout ?
Не думаю, что заметно было, что она отработала быстрее. Просто она выводила каждое число из-за отсутствия какой-либо проверки на условие, и выводила не быстрее, а больше раз через другие функции.
F.U.B.A.R????
Что ??
Спасибо за урок!
Спасибо!
Круто!!
спасибо
спасибо
Спасибо