Что подразумевается под делегатами в C++?
Вопрос
Что подразумевается под делегатами в С++, является ли функция сортировки в c/С++, которая принимает функцию/функтор сравнения в качестве последнего параметра, формой делегата?
Решение
«Делегировать» на самом деле не является частью терминологии C++.В C# это что-то вроде прославленного указателя на функцию, который может хранить адрес объекта, а также вызывать функции-члены.Вы, конечно, можете написать что-то подобное на C++ как небольшую библиотечную функцию.Или еще более общий:Объединить boost::bind<>
с boost::function<>
.
В C++ мы используем термин «объект функции».Функциональный объект — это что угодно (включая указатели на функции), которое можно «вызвать» с помощью оператора вызова функции().
std::sort принимает «предикат», который представляет собой специальный объект функции, который не изменяет свои аргументы и возвращает логическое значение.
Другие советы
Функции обратного вызова в C++ можно (в общих чертах) назвать формой delegates
( хотя delegate
термин для этого не используется).Функции обратного вызова используют указатели на функции для передачи их в качестве параметров другим функциям.Но делегаты в C# более продвинуты по сравнению с функциями обратного вызова в C++.
Делегировать работу – значит разделить рабочую нагрузку с другими.В реальной жизни, если бы вы делегировали свою задачу, то есть если бы вы были менеджером, вы бы делились своей работой, ожидая, что другие выполнят задачу, а вы не должны знать, как это сделать.
Концепция одинакова в C++ и любых других языках, имеющих возможность делегатов.В C вы можете увидеть это как делегат:
int calculate(int (*func)(int c), int a, int b)
Потому что ожидается, что вы отправите указатель на другую функцию, которая выполнит за вас некоторую работу.Недавно я написал Сообщение блога об указателях функций в Python и C, посмотрите, возможно, это вам поможет.Возможно, это не «традиционный» способ делегирования работы в C или C++, но опять же, терминология говорит, что я немного прав.
Делегация в основном используется как способ передачи функций функциям, встроенным в класс (pimpl, агрегация, частное наследование).В основном это (встроенные) функции одной строки, вызывающие функции классов-членов.Насколько я знаю, это не имеет никакого отношения к делегатам C#.
В этом смысле указатель на функцию, используемый в qsort, является не делегатом, а обратным вызовом, в котором модули инфраструктуры могут быть расширены пользовательским программным обеспечением, как в примере Голливудский принцип.
Делегат:Объект, который действует как многофункциональный указатель с системой подписки.Это действительно упрощает использование статических или «объектных» указателей на функции-члены для уведомлений об обратном вызове и обработки событий.
Этот ссылка объясняет делегатов в доступной форме, или вы также можете обратиться к MSDN связь.