#cpp
Является ли функция функтором? Функцию можно применять в качестве функтора в STL алгоритмах, но почему-то книги упорно доказывают, что функция это функция, а функтор - это именно объект
Ответы
Ответ 1
В стандарте C++ нет такого термина, как функтор. Обычно в книгах под этим понятием подразумевают так называемый объект функции - термин, который действительно определен в стандарте C++. Из стандарта C++ (20.9 Function objects) 1 A function object type is an object type (3.9) that can be the type of the postfix-expression in a function call (5.2.2, 13.3.1.1).230 A function object is an object of a function object type. In the places where one would expect to pass a pointer to a function to an algorithmic template (Clause 25), the interface is specified to accept a function object. This not only makes algorithmic templates work with pointers to functions, but also enables them to work with arbitrary function objects. Поэтому под функторами авторы книг скорей всего имеют в виду объекты функций. Так как функции не относятся к типам объектов, то они не включаются в это понятие. С другой стороны а сноске 230 написано относительно типа постфиксного выражения вызова функции 230) Such a type is a function pointer or a class type which has a member operator() or a class type which has a conversion to a pointer to function. Тем не менее, алгоритмы могут принимать функции по ссылке, а не обязательно указатели на функции. Сама приведенная цитата может трактоваться неоднозначно. Думаю, что ключом к ее правильной трактовке является следующая фраза из приведенной цитвты In the places where one would expect to pass a pointer to a function to an algorithmic template (Clause 25), the interface is specified to accept a function object. Именно здесь, вероятно, авторы книг проводят водораздел между объектами, которые предоставляют оператор функцию, и простыми указателями на функции, называя первых функторами.Ответ 2
Основное отличие функции от функтора заключается в том, что функция не имеет состояния, а функтор, являющийся объектом, обладать состоянием может. Конечно, можно предложить к рассмотрению частный случай, когда внутри функции определена статическая переменная, или используется какая-то внешняя (глобальная) переменная. Но такие функции нельзя будет использовать в двух разных контекстах, т.к. состояние будет общее. Использование функтора (т.е. объекта, с перегруженным operator()) позволяет разделять состояние для разных вызовов. Так же типы функторов могут использоваться в качестве параметров шаблона. Разные типы функторов позволят получать разные типы инстанцированных объектов, даже если сигнатуры operator() у них одинаковые. А если у Вас есть две разные функции с одинаковыми сигнатурами, например, int g(double), int f(double), то тип этих функций всё равно будет одинаковый int(double).Ответ 3
Да запросто. Просто это - вызываемый объект. Функция - вызываема? несомненно. Объект? А почему нет? Что такое указатель, как не объект определенного типа? Короче, функция - это частный случай функтора, только и всего.
Комментариев нет:
Отправить комментарий