170 похожих чатов

Расскажите про функции высшего порядка. Я гляжу, обычно они используются,

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

16 ответов

23 просмотра

std::thread, std::invoke, std::bind

Ivan Sokolov
std::thread, std::invoke, std::bind

В каких ситуациях в целом лучше использовать std::bind вместо той же лямбды? Насколько я помню, std::bind не умеет даже в мув параметров в std::function

Dian Blasphemous¿
В каких ситуациях в целом лучше использовать std::...

На сколько я понимаю, одно из применений bind - это если нам нужно пробросить аргументы куда либо без лишних затрат. Например аргументы в конструкор объекта при вызове emplace_back в векторе. То есть, если нам нужна такая обёртка над функцией, которая не делает ничего (реализовать такое не так тривиально, как кажется). Плюс, bind вариабельный шаблон использует, можно передавать туда нефиксированное количество элементов. А лямбда - это лямбда. Она создаёт замыкание. Если без захвата, то это больше похоже на указатель на функцию, если с захватом - то это похоже на объект, с состоянием и перегруженным оператором "operator()". Не понимаю последнего утверждения от слова совсем: вы говорите про мув параметров из std::bind в std::function? Если да, то зачем? Как будто бы это не имеет никакого смысла. Надеюсь более опытные участники чата меня поправят или дополнят, если где то не так сказал

Dian Blasphemous¿
В каких ситуациях в целом лучше использовать std::...

Ни в каких, если уровень поддержки стандарта компилятором позволяет, а сейчас уже почти все компиляторы поддерживают 11ый

Функция высшего порядка при сортировке это не предикат сравнения, а сама сортировка, поэтому так и называется. srd::sort - функция высшего порядка, предикат - обычная функция. transform - ФЦП, функция преобразования одного элемента - обычная функция reduce - ФКП, и редуктор - обычная функция. По другому ещё (в С) это называется функция и callback- функция, как в find_first/next и call back для обработки одного файла. Поэтому если вам кто-то скажет, что C (чистый) не функциональный язык, не верьте, это не так.

The Pressbraker- Автор вопроса
Ilya Zviagin
Функция высшего порядка при сортировке это не пред...

Насчет С, да, это я знаю, что ты можешь передать имя функции, что равнозначно передаче указателя на функцию. Кстати, чем мне нравится С++ так это тем, что ты можешь у класса сделать "оператор функция", то есть ты можешь создать как бы вызываемый объект с состоянием (наполнить его какими то полезными данными), и потом уже вызвать его как функцию. Я сейчас изучаю С#, и там такого, блин нет... Я, если честно, в шоке. Вот человек, тоже в шоке, https://stackoverflow.com/questions/2450153/overloading-function-call-operator-in-c-sharp . В этом плане С++ даже более простой что ли...

The Pressbraker
Насчет С, да, это я знаю, что ты можешь передать и...

в C# функции, с которыми можно работать как со значениями (записывать в переменные, соответственно, передавать в другие функции, хранить как состояние (поле) объекта, т.д.), называются делегатами. Один из стандартных делегатов в пространстве имен System — Func: Func<int, int, string> function = (x, y) => { return $"{x} + {y} = {x + y}"; }; Console.WriteLine(function(10, 2)); // 10 + 2 = 12 function = (x, y) => $"{x} * {y} = {x * y}"; Console.WriteLine(function(10, 2)); // 10 * 2 = 20 Работать с простым объектом класса как с функцией нельзя, хотя можно просто определить в нем функцию и вызвать 🤷🏼

Sasha Олександрович
в C# функции, с которыми можно работать как со зна...

нет, даже в C# "делегат" - это не сама функция, а именно специальный тип, хранящий ссылку на функцию.

Anton Semenov
нет, даже в C# "делегат" - это не сама функция, а ...

это уже формальности реализации этой функциональности

Anton Semenov
нет, даже в C# "делегат" - это не сама функция, а ...

так никто не заставляет огород городить — все нужные делегаты уже есть в System

Sasha Олександрович
так никто не заставляет огород городить — все нужн...

"огород" - это именно букет этих System.Func (и то не на все случаи жизни, вдруг я захочу функцию с 20 аргументами? 🤡), которые являются (в терминологии C++) чем-то вроде явных инстанциирований шаблона. Ну и многие пользователи заводят свои делегаты с более строгой типизацией. Ну да ладно, прекращаю оффтопить

Sasha Олександрович
что значит "более строгая типизация"?

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

Anton Semenov
что ты хочешь завести именованный коллбэк с конкре...

> Да, Func туда подойдет, но часто в библиотеках заводят свои типы ну так пусть не заводят 🥲

Anton Semenov
"огород" - это именно букет этих System.Func (и то...

на счет количества параметров да, типы делегатов System принимают до 16-ти. Если нужно больше, нужно написать свой, и делается это очень просто

Sasha Олександрович
на счет количества параметров да, типы делегатов S...

блин, так я же и говорю, что это просто - за счет ключевого слова delegate, которое сгенерирует тип для тебя. По сути инстанциирует некую внутреннюю std::fuction от тех типов, которые ты просил.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта