![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
knut |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
Добрый день.Меня мучает вопрос касающий функторов.
1.Вот если главная задаяча функтора это соxраниние даныx между вызовами функции то не получиться это все зделать с помощью статическиx переменныx?(Можно реальный пример с использ.функторов или сылку где можно прочитать)В чем фишка функтора? 2.Аналог делегата в с++.Есть вообще связь между делегатом и функтором? Вообще скинте сылки где прочитать буду признателен ![]() --------------------
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Аналог делегата - указатель на функцию.
Подробнее - гугл в помощь. Одна из главных задач функтора - возможность передачи функции как параметра шаблона. Для этого в классе перегружается operator() и выходит функтор. А сохранение переменных между вызовами - делай как хочешь. Но лучше нестатически, потому что у тебя могут сосуществовать несколько разных экземпляров функтора одновременно. |
|||
|
||||
knut |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
т.е экземпляр класса ведет себя как функция я правельно понял?если да то что это нам дает?() можем писать так
--------------------
|
||||||
|
|||||||
zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
knut, да, именно так.
Вообще говоря, тема функторов очень обширна... Я прочитал когда твой пост думал отвечать-не отвечать, в итоге забил =) Читай, например, Александреску, или новые сложные от Саттера - там эта тема исчерпывающим образом раскрыта. --------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Передавать как параметр шаблона, например, в стандартные контейнеры STL(допустим, функцию сравнения двух элементов). |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Не совсем. Не помню, как в С# 1.0, но уже во второй версии, можно делать делегаты прямо в коде - по сути лямбда-функции. В плюсах для этого нет языковой поддержки (я надеюсь - и не будет, это не в стиле плюсов), но есть ФП в стиле STL, и (как его развитие) - в стиле буста (да, да и ещё раз да). std::bind1st, std::bind2nd, boost::bind, boost::lambda, boost::signals, boost::function - это приплющенное функциональное программирование. Собственно функторы - это основа ФП в плюсах. Биндить обычные функции (во что?), генерить лямбды (что мы получим?) и прочее - как сие представить без функторов. В этом мне сильно не нравится кутешные сигнал/слоты, которые реализуется как таблицы строка => казатель на функцию. Очень часто мне бы хотелось рантайм генерацию слотов (как объектов). boost::signals явно рулит, но не доделан: 1. непотокобезопасный 2. нет возможности разделения на коннект слотов, и инициация сигнала (часто коннектить может кто угодно, а инициация - прайват или протектед). |
|||
|
||||
zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Любитель, а в чем именно проявляется его непотокобезопасность? Я это читал в документации, но не догнал.
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
knut |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
JackYF,
а что это без функтора нельзя зделать? --------------------
|
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
В большинстве ситуаций с STL - контейнерами - да.
Здесь Compare - обязательно класс. Функция - это не класс, поэтому ты можешь передать в шаблон только функтор. |
|||
|
||||
Любитель |
|
||||||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Если не ошибаюсь - одновременный коннект слотов к одному сигналу. Дома посмотрю поподробнее. ЗЫ. Может попробовать исправить (если это будет достаточно реально)? Просто фраза "функтор - аналог делегата" пожалуй даже точнее чем "указатель на функцию - аналог делегата". Хотя и это не корректно. Лучше аналогий не проводить (приплющенное ФП уникально по своей природе ![]() Добавлено @ 18:51
Ой, а ты проверял. В темплейтах class означает "тип". Указатель на функцию также имеет тип. Сие вполне будет работать. Ну скажем (сновываясь только на твоём коде):
Посмотри на boost::function (ожно в онлайне - чтобы не качать сию бесполезную вещь), параметр шаблона - класс функтора или тип указателя на функцию. |
||||||
|
|||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Все иронизируешь... ![]() А ты? Сие не только не будет работать, оно даже не откомпилируется. (Вообще, я там раньше имел, конечно же, ввиду set, но это не суть важно). GCC: error: invalid cast to function type `bool ()()' Так-то. Добавлено @ 19:16 Я против boost::function ничего не имею... Но мне пока она не была нужна. |
|||
|
||||
Любитель |
|
||||||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
JackYF, не внимательно читаем. Начинаю цитировать самого себя:
сновываясь == основываясь То есть всё что мы знали о map - твоё обявление. Я не думал (или не хотел думать) о std::map. Хотя соглашусь, для совместимости с функторами надо было написать так (использовать тип указателя на функцию, а не функции - как я написал):
А то, что я сказал работает. При соответствующем объявлении класса map (усекаем до минимума):
Любой нормальный компилер проглотит. Здесь есть правда ошибка - ... логическая. Compare по идее должна что-то сравнивать, а уна сие не так. ![]() И всё же можно добавить функцию для установки компаратора. Если мы пишем, как я написал ранее, то придётся добавить пару звёздочек (после Compare - в функции и в обяъвлении поля). Особо старательные могут написать обобщённый код (с boost::enable_if), чтобы воспринимались как функции, так и указатели на них (и совместимые по семантике вызова с последними функторы). Для простоты считаем, что мы всё же пишем test<bool (*)()> (подчёркиваю - сие явно не функтор). Можно написать сию (абсолютно бесполезную) вещь:
Замечу, что Compare не обязан возвращать bool, он должен к нему приводится. Прикол в том, что f одновременно и указатель на функцию и сама функция. Интересен тот факт, что для функций-членов (по стандарту) однако наджо использовать амперсанд. ТАк уж есть. По сабжу - повторюсь функтор нужен для ФП (функционального программирования). Если нитересно - могу напридумывать тривиальных примеров (не хочется зря писать - если не интересно). Я сипипишное ФП очень люблю, потому меня сия тема интересует. В какой-то мере... Просто, когда я ещё в школе учился, жил в небольшом таком городке и сидел дома на диалапе ![]() ![]() Добавлено @ 11:18 ЗЫ коммент в f я зря поставил ![]() |
||||||
|
|||||||
knut |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
ну давай ![]() ![]() --------------------
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |