Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
1

Что такое функтор

29.01.2017, 13:37. Показов 4323. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро,

верное ли данное утверждение:
Обычная функция с возвращаемым значением типа bool может быть предикатом. Но она не функтор(1).
Функтор (функциональный объект) - объект пользовательского типа с перегруженной операцией вызова(3).
То есть, далеко не каждый функтор - это предикат(2). Далеко не каждый предикат - функтор.
Я считаю, что нет.

(1) Код ниже - в местах где принимается абстракция по имени функтор, может быть обычная функция возвращающая true/false - так как возр значения функтора всегда игнорируется в алгоритмах, ведь ожидается void
(2) Предикат это есть разновидность функтора - следовательно каждый предикат == функтор. Другая паралель, электронная сигарета не есть сигарета. (нет)
(3) Есть источники, что утверждают, что функтор это объект с перегруженным operator() - среди них в том числе MrGluck, тыц. Но моё мнение, что это не так. Тут опять происходит подмена понятий абстракция и реализация. Функтором является всё что угодно, что можно вызывать так:
C++
1
2
3
4
5
template <typename Fn>
void foo( Fn fn)
{
    fn();
}
Не могу найти статьи на SO - где проводился холли-вар - функция не объект, следовательно она не функтор. Но кажись там даже сами пришли соглашению, что слово объект обобщает, а применении функции для вызова как функцию является справедливым, ведь вызвать себя как функцию лучше всех может только функция

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
 
bool fn(const int x)
{
    cout << x << endl;
    return 0;
}
 
void main()
{
    int arr[10];
    std::iota(std::begin(arr), std::end(arr), 0);
    std::for_each(std::begin(arr), std::end(arr), fn);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2017, 13:37
Ответы с готовыми решениями:

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из...

10
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
29.01.2017, 13:47 2
Моё мнение такое: о терминах не спорят, о них договариваются.
Вы можете называть функторами или предикатами всё что угодно. Но если в разговоре с другими людьми вы будете использовать необщепринятые значения слов, то ни к чему хорошему это не приведёт.
2
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
29.01.2017, 14:02 3
ИМХО

Под понятием "функтор" обычно подразумевается объект с перегруженным оператором ().
Если говорить о самом моменте вызова т.е когда пишем name() то на самом деле пофигу как это называть, главное мы знаем что этот вызов сделает определенную вещь.

Но под капотом классы с перегруженным оператором() могут быть более функциональными чем обычные функции. Все таки нужно учесть тот факт что экземпляр функтора это объект, методы которого могут быть логически сгруппированы в одну сущность (возможно даже с применением наследования) а функции так не умеют. Если вдаваться в корень это не одно и то же.
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.01.2017, 14:24 4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Но она не функтор(1).
Предикат - частный случай функтора.
Соответственно
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
не каждый функтор - это предикат(2).
Да.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Далеко не каждый предикат - функтор.
Нет.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Функтор (функциональный объект) - объект пользовательского типа с перегруженной операцией вызова(3).
Функтор - это объект, который ведёт себя как функция.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
среди них в том числе MrGluck, тыц.
У меня сказано следующее:
Цитата Сообщение от MrGluck Посмотреть сообщение
Функторы (их еще называют объект-функциями) - конструкция, которая предоставляет возможность использовать объект как функцию. Это может быть структура или класс, перегружающие оператор().
Добавлено через 1 минуту
Я также согласен, что это больше вопрос терминологии, но по моему, функцию лучше не рассматривать как функтор, а называть прямо - функция.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
29.01.2017, 14:25  [ТС] 5
Цитата Сообщение от MrGluck Посмотреть сообщение
Нет.
Почему?

Цитата Сообщение от MrGluck Посмотреть сообщение
Это может быть структура или класс, перегружающие оператор().
То есть функция переданная в STL алгоритмы является функтором?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.01.2017, 14:40 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему?
Потому что
Цитата Сообщение от MrGluck Посмотреть сообщение
Предикат - частный случай функтора.
Это значит что любой предикат - функтор т.к. является его подмножеством.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
То есть функция переданная в STL алгоритмы является функтором?
Она является функцией.

Кстати, на известном сайте понятие функция и функтор (объект-функция) различают:
http://www.cplusplus.com/refer... /for_each/
Unary function that accepts an element in the range as argument.
This can either be a function pointer or a move constructible function object.
http://www.cplusplus.com/refer... /count_if/
Unary function that accepts an element in the range as argument, and returns a value convertible to bool. The value returned indicates whether the element is counted by this function.
The function shall not modify its argument.
This can either be a function pointer or a function object.
1
25 / 25 / 5
Регистрация: 04.01.2017
Сообщений: 52
29.01.2017, 16:18 7
Интересная статья на эту тему "Stop calling "Function Objects" "Functors"
1
_Ivana
29.01.2017, 17:49
  #8

Не по теме:

Цитата Сообщение от likehood Посмотреть сообщение
Моё мнение такое: о терминах не спорят, о них договариваются.
Согласен. Ведь всем известно, что функтор - это морфизм в категории категорий :)

0
tapochka
29.01.2017, 19:45
  #9

Не по теме:

тему лучше в священных войнах создавать... ибо https://habrahabr.ru/post/125995/

0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
31.01.2017, 07:17 10
rikimaru2013, надеюсь, Бьярне Страуструп всё ещё имеет какой-то вес в мире C++?

"The C++ programming language" (2013, 4th edition), страница 80:
Цитата Сообщение от Bjarne Stroustrup
3.4.3 Function Objects
One particularly useful kind of template is the function object (sometimes called a functor), which
is used to define objects that can be called like functions. For example:
C++
1
2
3
4
5
6
7
template <typename T>
class Less_than {
    const T val; // value to compare against
public:
    Less_than(const T& v) : val(v) {}
    bool operator()(const T& x) const { return x < val; } // call operator
};
Добавлено через 4 минуты
У него же ранее в "The C++ programming language" (1997, 3rd edition [Special Edition]), страница 515:
Цитата Сообщение от Bjarne Stroustrup
18.4 Function Objects [algo.fct]
<...>
An object of a class with an application operator (§11.9) is called a function-like object, a
functor, or simply a function object.
Добавлено через 1 минуту
rikimaru2013, в обеих книгах это единственный раз, когда Бьярне упоминает термин functor.

Добавлено через 10 минут
rikimaru2013, что касается стандарта, то ни в стандарте 1998-го года, ни в стандарте 2003-го года, ни в стандарте 2011-го года термин functor не встречается вовсе.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2017, 15:32 11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
верное ли данное утверждение:
вывод не очень четкий.
функтор - объект, который косит под функцию.
у него конкретно перегружен оператор()
предикат - вообще любая ботва,
которая подходит по утиной нотации.

C++
1
int v = foo(); //<--- чем является foo?
Кликните здесь для просмотра всего текста
запуск конструктора класса.
где нибудь в шаблончиках запросто сканает за предикат
1
31.01.2017, 15:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2017, 15:32
Помогаю со студенческими работами здесь

Что такое IIS и что такое PWS? Почему одно без другого не работает?
вот уже второй день пытаюсь немного разобраться в АСП. накидал небольшую тестовую страничку. но с...

Что такое напряжение и что такое сила тока с позиции заряженных частиц
Объясните пожалуйста, что такое напряжение и что такое сила тока с позиции заряженных частиц....

Что такое монитор и что такое мьютекс? Это же разные вещи?
Здравствуйте. В разных айти-статьях по-разному используют эти термины, причём часто их путают друг...

Объект TDictionary. Что такое ключ и что такое значение?
Из прочитанного в гугле понял что это нечто наподобие какого-то словаря: Коллекция пар...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru