Что подразумевается под делегатами в C ++? - PullRequest
0 голосов
/ 22 декабря 2009

Что подразумевается под делегатами в c ++, выполняет ли функция сортировки в c / c ++ функцию, которая принимает функцию / функцию сравнения в качестве последнего параметра в форме делегата?

Ответы [ 5 ]

5 голосов
/ 22 декабря 2009

«делегат» на самом деле не является частью терминологии C ++. В C # это что-то вроде прославленного указателя на функцию, который также может хранить адрес объекта для вызова функций-членов. Конечно, вы можете написать что-то подобное в C ++ как небольшую библиотечную функцию. Или даже более общий: объедините boost::bind<> с boost::function<>.

В C ++ мы используем термин «объект функции». Функциональный объект - это что угодно (включая указатели функций), которое «вызывается» через оператор вызова функции ().

std :: sort принимает «предикат», представляющий собой объект специальной функции, который не изменяет свои аргументы и возвращает логическое значение.

2 голосов
/ 22 декабря 2009

Делегировать работу - значит делиться рабочей нагрузкой с другими. В реальной жизни, если бы вы делегировали свою задачу, т.е. если вы менеджер, вы бы поделились своей работой, ожидая, что другие выполнят задачу, и вам не нужно будет знать, как.

Концепция одинакова в C ++ и любых других языках, имеющих возможность делегатов. В C вы можете видеть это как делегат:

int calculate(int (*func)(int c), int a, int b)

Поскольку ожидается, что вы отправите указатель на другую функцию, которая вычислит для вас некоторую работу. Недавно я написал сообщение в блоге об указателях функций в Python и C, посмотрите его, вы можете найти его полезным. Возможно, это не «традиционный» способ делегирования работы в C или C ++, но опять же, термин «монополия» говорит, что я немного прав.

2 голосов
/ 22 декабря 2009

Функции обратного вызова в C ++ могут (свободно) называться формой delegates (хотя термин delegate для этого не используется). Функции обратного вызова используют указатели на функции для передачи их в качестве параметров другим функциям. Но делегаты в C # более продвинуты по сравнению с функциями обратного вызова в C ++.

1 голос
/ 22 декабря 2009

Делегирование в основном используется для передачи функций функциональности, встроенной в класс (pimpl, агрегация, частное наследование). Это в основном (встроенные) функции одной строки, вызывающие функции классов-членов. Насколько я знаю, это не имеет ничего общего с делегатами C #.

В этом смысле указатель на функцию, используемый в qsort, является не делегатом, а обратным вызовом, в котором модули инфраструктуры могут быть расширены программным обеспечением пользователя, как в голливудском принципе .

0 голосов
/ 22 декабря 2009

Делегат : объект, который действует как многофункциональный указатель в системе подписки. Это действительно упрощает использование статических или объектных указателей на функции-члены для уведомлений об обратном вызове и обработки событий.

Эта ссылка объясняет делегатов в ясной форме, или вы также можете обратиться к ссылке MSDN .

...