Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Функторы vs свободные функции


Автор: chipset 1.3.2006, 23:46
Привет всем smile
Курю тут потихоньку Майерса, ЭФфективный STL и наблюдаю тот факт что он сует функторы где-бы не попало. Аргументируя следующим:
1. Когда рак на горе свистнет то может придеться добавлять дополнительные параметры (правда тут спокойно используеться bind1,2st или вообще boost).
2. Компилятору проще про-инлайнить оператор () чем функцию.

У меня на это есть следующие возражения:
1. А если по дизайну запрещено добавлять новые параметры?
2. А если ин-лайн функцией в класс?
3. А не будет ли это менее читабельнее, все-таки новый класс подсознательно говорит читателю о том что это класс а не функтор?

А тут ещё Александреску грозиться вешать всех кто пишет жуткие классы вместо двух-строчного for smile
Может я чего-то упустил? Что вы используете?

Автор: DeadSoul 1.3.2006, 23:52
Цитата(chipset @ 1.3.2006, 23:46 Найти цитируемый пост)
3. А не будет ли это менее читабельнее, все-таки новый класс подсознательно говорит читателю о том что это класс а не функтор?

Нет. не говорит.smile

Автор: JackYF 2.3.2006, 06:07
Мне пару раз приходилось использовать и то, и то. Функция, по мне, все-таки читабельней...

Автор: MAKCim 2.3.2006, 08:30
само понятие функтор - обобщение функции/процедуры/метода/любой сущности к которой применяется operator()
значит не надо никакой обобщенности, в принципе не планируется ничего по ходу дела добавлять, можно пользоваться обычными ф-ями/методами
по поводу читабельности по мне так одинаково, вызов функтора так вообще ничем не отличается от вызова ф-ии

Автор: Earnest 2.3.2006, 15:51
Сначала надо потренироваться - везде писать функторы, где хотя бы принципиально можно. Чтобы мозги привыкли в эту сторону думать.
Потом успокоиться и писать как нравится - как кажется более читабельным.
Я пишу по разному. Иногда, если действие хорошо локализуется, и нужно выполнить ряд таких действий в функции, лучше выглядят функторы + алгоритмы:

Код

std::for_each(items.begin(),items.end(),_ReplaceSomething(...));

std::for_each(items.begin(),items.end(),_MarkBySomeCriteria(...));
 
std::remove_if(items.begin(),items.end(),_Marked());


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

Автор: chipset 3.3.2006, 01:23
Цитата(Earnest @ 2.3.2006, 05:51 Найти цитируемый пост)
Комментарии можно не писать... А если заменить это дело циклами - будет хуже читаться.

Я всё больше к этому прихожу и стараюсь использовать transform, for_each, remove_copy и прочие везде где это только возможно без особого затруднения чтения. ИМХО, for'ы и while'ы не настолько читабельны.
Просто в них можно использовать как свободные функции так и функторы, афаик.
Цитата(MAKCim @ 1.3.2006, 22:30 Найти цитируемый пост)
само понятие функтор - обобщение функции/процедуры/метода/любой сущности к которой применяется operator()

Цитата(Wiki)

A function object, often called a functor, is a computer programming construct allowing an object to be invoked or called as if it were an ordinary function

Цитата(MAKCim @ 1.3.2006, 22:30 Найти цитируемый пост)
вызов функтора так вообще ничем не отличается от вызова ф-ии

Поэтому я и задал такой вопрос smile

Автор: MAKCim 3.3.2006, 08:35
впринципе, если разобраться то все-таки вызов функтора - менее производителен, т. к вызов ф-ии/метода...происходит после вызова operator(), двойной вызов происходит не всегда (например предикаты), но обычно происходит и наверное это медленнее

Автор: zss 3.3.2006, 10:19
Цитата(MAKCim @ 3.3.2006, 08:35 Найти цитируемый пост)
впринципе, если разобраться то все-таки вызов функтора - менее производителен

Тот же Мейерс приводит убедительные доказательства по производительности в пользу функтора

Как он говорит прирост достигал 160% на некоторых платформах
и подробно объяснил это (где-то уже под конец)

Автор: Daevaorn 3.3.2006, 10:41
Ну у функтора есть ряд преимуществ. Он, допустим, может сохранять некое своё состояние. И от итерации к итерации, от алгоритма к алгоритму менять своё поведение. Согласитесь, что иногда очень полезно. Нет, конечно, это можно сделать и свободными функциями с использованием статических переменный, но это менее удобно, и как говориться, ухудшает дизайн.

Автор: chipset 3.3.2006, 11:14
Цитата(MAKCim @ 2.3.2006, 22:35 Найти цитируемый пост)
впринципе, если разобраться то все-таки вызов функтора - менее производителен, т. к вызов ф-ии/метода...происходит после вызова operator(), двойной вызов происходит не всегда (например предикаты), но обычно происходит и наверное это медленнее

Компилятор инлайнит оператор скобки.
Цитата(Daevaorn @ 3.3.2006, 00:41 Найти цитируемый пост)
Ну у функтора есть ряд преимуществ. Он, допустим, может сохранять некое своё состояние.

Я это понимаю. В начале топика, я упоминал ту ситуацию когда ему НЕ НАДО хранить своё состояние smile

Автор: MAKCim 3.3.2006, 20:11
Цитата

Компилятор инлайнит оператор скобки.

очень даже не факт, компиляторов-то много smile

Автор: Void 3.3.2006, 20:59
Цитата(MAKCim @ 3.3.2006, 22:11 Найти цитируемый пост)
очень даже не факт, компиляторов-то много

С компилятором, не способным инлайнить хотя бы простейшие функции, использование половины алгоритмов STL теряет смысл.

Почти в тему: вот http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1968.pdf — proposal комитета по введению в C++ полноценных анонимных функций (aka лямбда-функций). Предложение исходит (в том числе) от самого Страуструпа и автора Boost.Lambda. Помнится, долгие дискуссии в c.l.c++.m сводились к тому, что нормально реализовать это не удастся, однако ж…

Автор: chipset 6.3.2006, 03:41
На самом деле boost это уже "второй STL" smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)