Функциональные указатели и функторы - PullRequest
0 голосов
/ 18 августа 2011

Являются ли указатели функций функторами?Есть ли в использовании виртуальный функтор, который помогает скомпилировать функторы одного уровня?

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

По крайней мере, поскольку этот термин обычно используется в C ++ (Внимание: он используется полностью по-разному относительно других языков, таких как Haskell), функтор - это класс (или экземпляр класса), который перегружает operator() так что его можно вызывать как функцию.

Поскольку они используют один и тот же синтаксис, шаблон может быть написан так, чтобы принимать либо указатель на функцию , либо экземпляр функтора взаимозаменяемо. Однако не все алгоритмы будут делать это - некоторые ожидают (например), что вы предоставите что-то с typedef s для таких вещей, как argument_type и result_type. Стандартная библиотека предоставляет пару классов (unary_function и binary_function) для использования в качестве базовых классов для ваших функторов. Вы можете предоставить их самостоятельно, если хотите, - эти базовые классы предназначены исключительно для удобства (а некоторые люди не находят их особенно удобными).

0 голосов
/ 18 августа 2011

Указатель на функцию - это адрес реальной функции.Функтор - это класс, для которого operator() был перегружен;экземпляры этих классов могут передаваться и вызываться с тем же синтаксисом, что и функция.Так что нет, указатели на функции не являются функторами.

Я не знаю, что такое "виртуальные функторы" или "функторы братьев и сестер", поэтому я не могу ответить на второй вопрос.

...