Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функтор 
:(
    Опции темы
knut
Дата 14.12.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Добрый день.Меня мучает вопрос касающий функторов.
1.Вот если главная задаяча функтора это соxраниние даныx между вызовами функции то не получиться это все зделать с помощью статическиx переменныx?(Можно реальный пример с использ.функторов или сылку где можно прочитать)В чем фишка функтора?
2.Аналог делегата в с++.Есть вообще связь между делегатом и функтором?
Вообще скинте сылки где прочитать буду признателен smile


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
JackYF
Дата 14.12.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Аналог делегата - указатель на функцию.
Подробнее - гугл в помощь.

Одна из главных задач функтора - возможность передачи функции как параметра шаблона.
Для этого в классе перегружается operator() и выходит функтор.

А сохранение переменных между вызовами - делай как хочешь. Но лучше нестатически, потому что у тебя могут сосуществовать несколько разных экземпляров функтора одновременно.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
knut
Дата 14.12.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Цитата

Одна из главных задач функтора - возможность передачи функции как параметра шаблона.
Для этого в классе перегружается operator() и выходит функтор.

т.е экземпляр класса ведет себя как функция я правельно понял?если да то что это нам дает?()
можем писать так
Код

class Test
{
   private: 
              int i;
   int operator(int a,int b)
     {
         return i+a+b;
     } 
}
Test ob;
cout<<ob(5,5);



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
zabivator
Дата 14.12.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



knut, да, именно так.
Вообще говоря, тема функторов очень обширна... Я прочитал когда твой пост думал отвечать-не отвечать, в итоге забил =) Читай, например, Александреску, или новые сложные от Саттера - там эта тема исчерпывающим образом раскрыта.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
JackYF
Дата 14.12.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(knut @  14.12.2006,  17:18 Найти цитируемый пост)
если да то что это нам дает?()


Передавать как параметр шаблона, например, в стандартные контейнеры STL(допустим, функцию сравнения двух элементов).





--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 14.12.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(JackYF @  14.12.2006,  16:53 Найти цитируемый пост)
Аналог делегата - указатель на функцию

Не совсем. Не помню, как в С# 1.0, но уже во второй версии, можно делать делегаты прямо в коде - по сути лямбда-функции. В плюсах для этого нет языковой поддержки (я надеюсь - и не будет, это не в стиле плюсов), но есть ФП в стиле STL, и (как его развитие) - в стиле буста (да, да и ещё раз да).
std::bind1st, std::bind2nd, boost::bind, boost::lambda, boost::signals, boost::function - это приплющенное функциональное программирование. Собственно функторы - это основа ФП в плюсах. Биндить обычные функции (во что?), генерить лямбды (что мы получим?) и прочее - как сие представить без функторов.

В этом мне сильно не нравится кутешные сигнал/слоты, которые реализуется как таблицы строка => казатель на функцию. Очень часто мне бы хотелось рантайм генерацию слотов (как объектов). boost::signals явно рулит, но не доделан:
1. непотокобезопасный
2. нет возможности разделения на коннект слотов, и инициация сигнала (часто коннектить может кто угодно, а инициация - прайват или протектед).


--------------------
PM MAIL ICQ Skype   Вверх
zabivator
Дата 14.12.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Любитель, а в чем именно проявляется его непотокобезопасность? Я это читал в документации, но не догнал.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
JackYF
Дата 14.12.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Любитель @  14.12.2006,  18:08 Найти цитируемый пост)
Не совсем.

Я же сказал - "аналог", а не то же самое smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
knut
Дата 14.12.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



JackYF
Цитата

Передавать как параметр шаблона, например, в стандартные контейнеры STL(допустим, функцию сравнения двух элементов).

а что это без функтора нельзя зделать?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Daevaorn
Дата 14.12.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(knut @  14.12.2006,  19:28 Найти цитируемый пост)
а что это без функтора нельзя зделать? 

Ты сам уже написал вначале, что функтор позволяет сохранять состояния между вызывами. Обчыная функция такой гибкостью не обладает(почти).
PM MAIL WWW   Вверх
JackYF
Дата 14.12.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



В большинстве ситуаций с STL - контейнерами - да.

Код

template <class _Key, class _Compare, class _Alloc>
class map;


Здесь Compare - обязательно класс. Функция - это не класс, поэтому ты можешь передать в шаблон только функтор.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 14.12.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(zabivator @  14.12.2006,  18:12 Найти цитируемый пост)
Любитель, а в чем именно проявляется его непотокобезопасность?

Если не ошибаюсь - одновременный коннект слотов к одному сигналу. Дома посмотрю поподробнее.

ЗЫ. Может попробовать исправить (если это будет достаточно реально)?


Цитата(JackYF @  14.12.2006,  18:17 Найти цитируемый пост)
Я же сказал - "аналог", а не то же самое

Просто фраза "функтор - аналог делегата" пожалуй даже точнее чем "указатель на функцию - аналог делегата". Хотя и это не корректно. Лучше аналогий не проводить (приплющенное ФП уникально по своей природе  smile )

Добавлено @ 18:51 
Цитата(JackYF @  14.12.2006,  18:33 Найти цитируемый пост)
Здесь Compare - обязательно класс. Функция - это не класс, поэтому ты можешь передать в шаблон только функтор

Ой, а ты проверял. В темплейтах class означает "тип". Указатель на функцию также имеет тип. Сие вполне будет работать. Ну скажем (сновываясь только на твоём коде):
Код

map<int, bool (), my_allocator> my_map;


Посмотри на boost::function (ожно в онлайне - чтобы не качать сию бесполезную вещь), параметр шаблона - класс функтора или тип указателя на функцию.


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 14.12.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Любитель @  14.12.2006,  18:47 Найти цитируемый пост)
Посмотри на boost::function (ожно в онлайне - чтобы не качать сию бесполезную вещь)

Все иронизируешь... smile


Цитата(Любитель @  14.12.2006,  18:47 Найти цитируемый пост)
map<int, bool (), my_allocator> my_map;

Цитата(Любитель @  14.12.2006,  18:47 Найти цитируемый пост)
Ой, а ты проверял.

А ты? Сие не только не будет работать, оно даже не откомпилируется.
(Вообще, я там раньше имел, конечно же, ввиду set, но это не суть важно).

GCC: 
error: invalid cast to function type `bool ()()'

Так-то.

Добавлено @ 19:16 
Я против boost::function ничего не имею... Но мне пока она не была нужна.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 15.12.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



JackYF, не внимательно читаем. Начинаю цитировать самого себя:
Цитата(Любитель @  14.12.2006,  18:47 Найти цитируемый пост)
сновываясь только на твоём коде

сновываясь == основываясь
То есть всё что мы знали о map - твоё обявление. Я не думал (или не хотел думать) о std::map.
Хотя соглашусь, для совместимости с функторами надо было написать так (использовать тип указателя на функцию, а не функции - как я написал):
Код

map<int, bool (*) (int, int), my_allocator> my_map;

А то, что я сказал работает. При соответствующем объявлении класса map (усекаем до минимума):
Код

template <class Compare>
class test
{
public:
   test();
};

int main()
{
   test<bool ()> t;
}


Любой нормальный компилер проглотит. Здесь есть правда ошибка - ... логическая. Compare по идее должна что-то сравнивать, а уна сие не так.  smile 

И всё же можно добавить функцию для установки компаратора. Если мы пишем, как я написал ранее, то придётся добавить пару звёздочек (после Compare - в функции и в обяъвлении поля). Особо старательные могут написать обобщённый код (с boost::enable_if), чтобы воспринимались как функции, так и указатели на них (и совместимые по семантике вызова с последними функторы). Для простоты считаем, что мы всё же пишем test<bool (*)()> (подчёркиваю - сие явно не функтор). Можно написать сию (абсолютно бесполезную) вещь:
Код

public:
  void set_comparator(Compare cmp)
  { comparator = cmp; }

  bool result()
  { return comparator(); }

private:
  cmp;
};

bool f()
{ return true; // :) }

int main()
{
  test<bool (*)()> t;
  t.set_comparator(f);
  if (t.result())
    // ...
}


Замечу, что Compare не обязан возвращать bool, он должен к нему приводится.

Прикол в том, что f одновременно и указатель на функцию и сама функция. Интересен тот факт, что для функций-членов (по стандарту) однако наджо использовать амперсанд. ТАк уж есть.

По сабжу - повторюсь функтор нужен для ФП (функционального программирования). Если нитересно - могу напридумывать тривиальных примеров (не хочется зря писать - если не интересно). Я сипипишное ФП очень люблю, потому меня сия тема интересует.

Цитата(JackYF @  14.12.2006,  19:11 Найти цитируемый пост)
Все иронизируешь... 

В какой-то мере... Просто, когда я ещё в школе учился, жил в небольшом таком городке и сидел дома на диалапе smile , буст мне представлялся чем-то нереальным. Я это прекрасно помню. Поэтому я сказал просто тот факт, что это можно посмотреть в онлайне. Ну, доля тонкого намёка на противоречивость фразы "бесполезность буста" была. Но впрочем, я надеюсь, здесь она просто между делом (не говорить же про одно и то же в 10 темах  smile )

Добавлено @ 11:18 
ЗЫ коммент в f я зря поставил  smile 


--------------------
PM MAIL ICQ Skype   Вверх
knut
Дата 15.12.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Цитата

По сабжу - повторюсь функтор нужен для ФП (функционального программирования). Если нитересно - могу напридумывать тривиальных примеров (не хочется зря писать - если не интересно). Я сипипишное ФП очень люблю, потому меня сия тема интересует

ну давайsmileтема отчасти и для этого создавалaсь smile


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0948 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.